CodeForces - 1256D
记录0的位置,然后计算每一个往前动了多少就可
#include
#define ll long long
using namespace std;
const int MAXN = 1e6+5;
char C[MAXN],ans[MAXN];
vectorv;
int main()
{
int t;
cin>>t;
while(t--){
ll n,k;
cin>>n>>k;
v.clear();
cin>>C+1;
ans[n+1] = '\0';
for(int i=1;i<=n;i++){
ans[i] = '1';
if(C[i] == '0'){
v.push_back(i);
}
}
int len = v.size();
for(int i=0;i
CodeForces - 1267E
计算每个人如果想要超过第n个需要怎么删,优先删除票数差中最大的。
#include
#define ll long long
using namespace std;
const int MAXN = 105;
int a[MAXN][MAXN];
vectorv[MAXN];
struct node
{
int x,y,z,id;
}C[MAXN];
bool cmp(node A,node B)
{
return A.z
HDU - 4578
线段树,疯狂打标记
#include
#define ll long long
using namespace std;
const ll MAXN = 1e5+5;
const ll mod = 10007;
ll sum1[MAXN*4],sum2[MAXN*4],sum3[MAXN*4];
ll Set[MAXN*4],Add[MAXN*4],Mul[MAXN*4];
ll n,m;
void Up(ll p)
{
sum1[p] = (sum1[2*p] + sum1[2*p+1])%mod;
sum2[p] = (sum2[2*p] + sum2[2*p+1])%mod;
sum3[p] = (sum3[2*p] + sum3[2*p+1])%mod;
}
void build(ll p,ll l,ll r)
{
//cout<> 1)) % mod) + 3 * Add[p] * ((sum2[2*p] + sum1[2*p] * Add[p]) % mod)) % mod;
sum3[2*p+1] = (sum3[2*p+1] + (tmp * (len >> 1) % mod) + 3 * Add[p] * ((sum2[2*p+1] + sum1[2*p+1] * Add[p]) % mod)) % mod;
sum2[2*p] = (sum2[2*p] + ((Add[p] * Add[p] % mod) * (len - (len >> 1)) % mod) + (2 * sum1[2*p] * Add[p] % mod)) % mod;
sum2[2*p+1] = (sum2[2*p+1] + (((Add[p] * Add[p] % mod) * (len >> 1)) % mod) + (2 * sum1[2*p+1] * Add[p] % mod)) % mod;
sum1[2*p] = (sum1[2*p] + (len - (len >> 1)) * Add[p]) % mod;
sum1[2*p+1] = (sum1[2*p+1] + (len >> 1) * Add[p]) % mod;
Add[p] = 0;
}
}
void update(ll p,ll l,ll r,ll L,ll R,ll op,ll c)
{
if(L<=l && r<=R){
if(op == 1){
Add[p] += c;
ll tmp = ( ( (c*c)%mod * c )%mod * (r-l+1) ) %mod ;
sum3[p] = (sum3[p] + (3*c*sum2[p])%mod + ((3*c*c)%mod*sum1[p])%mod + tmp%mod )%mod;
sum2[p] = (sum2[p] + (2*c*sum1[p])%mod + ((c*c%mod)*(r-l+1)%mod) )%mod;
sum1[p] = (sum1[p] + (r-l+1)*c%mod )%mod;
}
else if(op == 2){
Mul[p] = (Mul[p] * c) % mod;
Add[p] = (Add[p] * c)%mod;
sum1[p] = (sum1[p] * c)%mod;
sum2[p] = ((sum2[p] * c)%mod * c)%mod;
sum3[p] = (((sum3[p] * c)%mod * c)%mod * c)%mod;
}
else if(op == 3){
Mul[p] = 1;
Add[p] = 0;
Set[p] = c;
sum1[p] = ((r - l + 1) * c)%mod;
sum2[p] = (((r - l + 1) * c)%mod * c)%mod;
sum3[p] = ((((r - l + 1) * c)%mod * c)%mod *c)%mod;
}
return ;
}
Down(p,(r-l+1));
ll mid = (l+r)/2;
if(L <= mid)
update(2*p,l,mid,L,R,op,c);
if(R > mid)
update(2*p+1,mid+1,r,L,R,op,c);
Up(p);
}
ll query(ll p,ll l,ll r,ll L,ll R,ll op)
{
//cout<
mid) ans += query(2*p+1,mid+1,r,L,R,op);
return ans%mod;
}
int main()
{
while(~scanf("%lld%lld",&n,&m)){
if(n == m&& n == 0)break;
ll op,x,y,c;
build(1,1,n);
for(ll i=1;i<=m;i++){
scanf("%lld%lld%lld%lld",&op,&x,&y,&c);
if(op != 4)
update(1,1,n,x,y,op,c);
else
printf("%lld\n",query(1,1,n,x,y,c));
}
}
}
CodeForces - 1253C
贪心,肯定是要排序,再从后往前拿,求个前缀和加个dp就行了。
#include
#define ll long long
using namespace std;
const ll MAXN = 2e5+5;
ll a[MAXN],dp[MAXN],sum[MAXN];
int main()
{
ll n,m;
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
sort(a+1,a+1+n);
for(ll i=1;i<=n;i++){
sum[i] = sum[i-1]+a[i];
}
for(ll i=1;i<=m;i++){
dp[i] = sum[i];
}
for(ll i=m;i<=n;i++){
dp[i] = sum[i-m]+dp[i-m]+(sum[i] - sum[i-m]);
}
for(ll i=1;i<=n;i++){
printf("%lld ",dp[i]);
}
printf("\n");
}
CodeForces - 1243B2
水水
#include
#define ll long long
using namespace std;
const int MAXN = 55;
char s1[MAXN],s2[MAXN];
struct node
{
int x,y;
}C[10005];
int tot = 0 ;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
tot = 0;
scanf("%d",&n);
scanf("%s%s",s1+1,s2+1);
bool ff = 1;
for(int i = 1;i<=n;i++){
if(s1[i] == s2[i])continue;
bool f = 0;
for(int j=i+1;j<=n;j++){
if(s1[j] == s1[i]){
C[++tot].x = j;
C[tot].y = i;
swap(s1[j],s2[i]);
f = 1;
break;
}
}
if(!f){
for(int j=i+1;j<=n;j++){
if(s1[i] == s2[j]){
C[++tot].x = n;
C[tot].y = j;
swap(s1[n],s2[j]);
C[++tot].x = n;
C[tot].y = i;
swap(s1[n],s2[i]);
f = 1;
break;
}
}
}
if(!f)ff = 0;
}
if(!ff)printf("No\n");
else{
printf("Yes\n%d\n",tot);
for(int i=1;i<=tot;i++){
printf("%d %d\n",C[i].x,C[i].y);
}
}
}
}
HDU - 1166
水水水
#include
#define ll long long
using namespace std;
const int MAXN = 1e5+5;
int sum[MAXN*4],a[MAXN];
char op[10];
void build(int p,int l,int r)
{
if(l == r){
sum[p] = a[l];
return ;
}
int mid = (l+r)/2;
build(2*p,l,mid);
build(2*p+1,mid+1,r);
sum[p] = sum[2*p] + sum[2*p+1];
}
int query(int p,int l,int r,int L,int R)
{
if(L<=l && r<=R){
return sum[p];
}
int ret = 0;
int mid = (l+r)/2;
if(L<=mid) ret += query(2*p,l,mid,L,R);
if(R > mid) ret += query(2*p+1,mid+1,r,L,R);
return ret;
}
void add(int p,int l,int r,int x,int k)
{
if(l == r&& l == x){
sum[p] += k;
return ;
}
int mid = (l+r)/2;
if(x<=mid)add(2*p,l,mid,x,k);
else add(2*p+1,mid+1,r,x,k);
sum[p] = sum[2*p] + sum[2*p+1];
return ;
}
int main()
{
int t,_=0;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
build(1,1,n);
printf("Case %d:\n",++_);
while(1)
{
int l,r;
scanf("%s",op);
if(op[0] == 'E')break;
scanf("%d%d",&l,&r);
if(op[0] == 'Q'){
printf("%d\n",query(1,1,n,l,r));
}
else if(op[0] == 'A'){
add(1,1,n,l,r);
}
else if(op[0] == 'S'){
add(1,1,n,l,-r);
}
}
}
}