题目链接:http://codeforces.com/contest/1136/problem
第一题(模拟):
#include<bits/stdc++.h>
using namespace std;
#define debug puts("YES");
#define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++)
#define ll long long
#define lrt int l,int r,int rt
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define root l,r,rt
#define mst(a,b) memset((a),(b),sizeof(a))
#define pii pair<int,int>
#define fi first
#define se second
#define mk(x,y) make_pair(x,y)
const int mod=1e9+7;
const int maxn=5e2+5;
const int ub=1e6;
ll powmod(ll x,ll y){ll t; for(t=1;y;y>>=1,x=x*x%mod) if(y&1) t=t*x%mod; return t;}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
int n,a[maxn],b[maxn],x;
int main(){
cin>>n;
rep(i,1,n+1) cin>>a[i]>>b[i];cin>>x;
int i=1;
for(;i<=n;i++) if(x<=b[i]&&x>=a[i]) break;
cout<<n-i+1<<endl;
return 0;
}
第二题(数学规律):
#include<bits/stdc++.h>
using namespace std;
#define debug puts("YES");
#define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++)
#define ll long long
#define lrt int l,int r,int rt
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define root l,r,rt
#define mst(a,b) memset((a),(b),sizeof(a))
#define pii pair<int,int>
#define fi first
#define se second
#define mk(x,y) make_pair(x,y)
const int mod=1e9+7;
const int maxn=5e2+5;
const int ub=1e6;
ll powmod(ll x,ll y){ll t; for(t=1;y;y>>=1,x=x*x%mod) if(y&1) t=t*x%mod; return t;}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
int n,k;
int main(){
cin>>n>>k;
int tmp=min(k-1,n-k);
cout<<n*3+tmp<<endl;
return 0;
}
第三题(数学思维):、
#include<bits/stdc++.h>
using namespace std;
#define debug puts("YES");
#define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++)
#define ll long long
#define lrt int l,int r,int rt
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define root l,r,rt
#define mst(a,b) memset((a),(b),sizeof(a))
#define pii pair<int,int>
#define fi first
#define se second
#define mk(x,y) make_pair(x,y)
const int mod=1e9+7;
const int maxn=5e2+5;
const int ub=1e6;
ll powmod(ll x,ll y){ll t; for(t=1;y;y>>=1,x=x*x%mod) if(y&1) t=t*x%mod; return t;}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
int n,m,a[maxn][maxn],b[maxn][maxn];
bool judge(int x,int y){
return x>=0&&x<n&&y>=0&&y<m;
}
int main(){
scanf("%d%d",&n,&m);
rep(i,0,n) rep(j,0,m) scanf("%d",&a[i][j]);
rep(i,0,n) rep(j,0,m) scanf("%d",&b[i][j]);
int tp1[maxn],tp2[maxn];
int cnt1=0,cnt2=0;
int flag=1;
for(int i=0;i<n&&flag;i++){
int tx=i,ty=0;
cnt1=0,cnt2=0;
while(judge(tx,ty)){
tp1[cnt1++]=a[tx][ty];
tp2[cnt2++]=b[tx][ty];
tx--,ty++;
}
sort(tp1,tp1+cnt1);
sort(tp2,tp2+cnt2);
rep(j,0,cnt1) if(tp1[j]!=tp2[j]) {flag=0;break;}
}
for(int i=0;i<m&&flag;i++){
int tx=n-1,ty=i;
cnt1=0,cnt2=0;
while(judge(tx,ty)){
tp1[cnt1++]=a[tx][ty];
tp2[cnt2++]=b[tx][ty];
tx--,ty++;
}
sort(tp1,tp1+cnt1);
sort(tp2,tp2+cnt2);
rep(j,0,cnt1) if(tp1[j]!=tp2[j]) {flag=0;break;}
}
if(flag) puts("YES");
else puts("NO");
return 0;
}
第四题(贪心+排序):
#include<bits/stdc++.h>
using namespace std;
#define debug puts("YES");
#define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++)
#define ll long long
#define lrt int l,int r,int rt
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define root l,r,rt
#define mst(a,b) memset((a),(b),sizeof(a))
#define pii pair<int,int>
#define fi first
#define se second
#define mk(x,y) make_pair(x,y)
const int mod=1e9+7;
const int maxn=5e5+5;
const int ub=1e6;
ll powmod(ll x,ll y){ll t; for(t=1;y;y>>=1,x=x*x%mod) if(y&1) t=t*x%mod; return t;}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
int n,m;
int pos[maxn],a[maxn];
struct node{
int x;
bool operator<(const node& y){
return pos[x]<pos[y.x];
}
};
vector<node> tmp[maxn];
int main(){
scanf("%d%d",&n,&m);
rep(i,1,n+1){
scanf("%d",&a[i]);
pos[a[i]]=i;
}
int tp=a[n];
rep(i,0,m){
int x,y;
scanf("%d%d",&x,&y);
tmp[x].push_back(node{y});
}
for(int i=n-1;i>=1;i--){
if(tmp[a[i]].size()){
int j=0,flag=0;
sort(tmp[a[i]].begin(),tmp[a[i]].end());
while(j++<tmp[a[i]].size()){
int tx=tmp[a[i]][j-1].x;
if(pos[tx]-j>pos[a[i]]) break;
if(tx==tp) {flag=1;break;}
}
if(flag){
j=0;
while(j++<tmp[a[i]].size()){
int tx=tmp[a[i]][j-1].x;
/// cout<<tx<<endl;
if(pos[tx]==pos[a[i]]+1)
swap(pos[tx],pos[a[i]]);
}
}
}
}
printf("%d\n",n-pos[tp]);
return 0;
}
第五题(线段树+二分):
#include<bits/stdc++.h>
using namespace std;
#define debug puts("YES");
#define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++)
#define ll long long
#define lrt int l,int r,int rt
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define root l,r,rt
#define mst(a,b) memset((a),(b),sizeof(a))
#define pii pair<int,int>
#define fi first
#define se second
#define mk(x,y) make_pair(x,y)
const int mod=1e9+7;
const int maxn=1e5+5;
const int ub=1e6;
const ll INF=-1e18;
ll powmod(ll x,ll y){ll t; for(t=1;y;y>>=1,x=x*x%mod) if(y&1) t=t*x%mod; return t;}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
ll a[maxn],k[maxn];
ll n,q;
int x,y;
int root[maxn<<2];
ll sum[maxn<<2],maxv[maxn<<2],lazy[maxn<<2];
void build(lrt){
lazy[rt]=INF;
if(l==r){
maxv[rt]=sum[rt]=a[l];
return ;
}
int mid=l+r>>1;
build(lson),build(rson);
maxv[rt]=max(maxv[rt<<1],maxv[rt<<1|1]);
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void pushdown(int rt,int l,int r,int mid){
if(lazy[rt]!=INF){
sum[rt<<1]=1LL*(mid-l+1)*lazy[rt];
sum[rt<<1|1]=1LL*(r-mid)*lazy[rt];
maxv[rt<<1]=lazy[rt];
maxv[rt<<1|1]=lazy[rt];
lazy[rt<<1]=lazy[rt<<1|1]=lazy[rt];
lazy[rt]=INF;
}
}
void update(int l,int r,int rt,int L,int R,ll v){
if(L>R) return ;
if(L<=l&&r<=R){
sum[rt]=1LL*(r-l+1)*v;
maxv[rt]=lazy[rt]=v;
return ;
}
int mid=l+r>>1;
pushdown(rt,l,r,mid);
if(L<=mid) update(l,mid,rt<<1,L,R,v);
if(mid<R) update(mid+1,r,rt<<1|1,L,R,v);
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
maxv[rt]=max(maxv[rt<<1],maxv[rt<<1|1]);
return ;
}
ll query1(int l,int r,int rt,int L,int R){
if(L<=l&&r<=R) return sum[rt];
int mid=l+r>>1;
pushdown(rt,l,r,mid);
ll ret=0;
if(L<=mid) ret+=query1(l,mid,rt<<1,L,R);
if(mid<R) ret+=query1(mid+1,r,rt<<1|1,L,R);
return ret;
}
ll query2(int l,int r,int rt,int L,int R){
if(L<=l&&r<=R) return maxv[rt];
int mid=l+r>>1;
pushdown(rt,l,r,mid);
ll ret=-mod;
if(L<=mid) ret=max(ret,query2(l,mid,rt<<1,L,R));
if(mid<R) ret=max(ret,query2(mid+1,r,rt<<1|1,L,R));
return ret;
}
int main(){
mst(k,0),mst(a,0);
cin>>n;
rep(i,1,n+1) cin>>a[i];
rep(i,1,n) cin>>k[i],k[i]+=k[i-1];
rep(i,1,n+1) a[i]-=k[i-1];
rep(i,1,n) k[i]+=k[i-1];
build(1,n,1);///
cin>>q;
string op;
while(q--){
cin>>op;
if(op[0]=='s'){
cin>>x>>y;
cout<<query1(1,n,1,x,y)+k[y-1]-k[max(0,x-2)]<<endl;
}else{
cin>>x>>y;
ll v=query1(1,n,1,x,x)+y;
int l=x,r=n,ans=r;
while(l<=r){
int mid=l+r>>1;
if(query2(1,n,1,x,mid)<=v) ans=mid,l=mid+1;
else r=mid-1;
}
update(1,n,1,x,ans,v);
}
}
return 0;
}