codeforces round #321 (div2)
codeforces#321(div2)
A题:水题。
#include<bits/stdc++.h> #define REP(i,a,b) for(int i=a;i<=b;i++) using namespace std; typedef long long ll; const int maxn=1000100; ll n,a[maxn]; int main() { //freopen("in.txt","r",stdin); while(cin>>n){ REP(i,1,n) scanf("%I64d",&a[i]); int ans=1,now=1; REP(i,2,n){ if(a[i]>=a[i-1]) now++; else now=1; ans=max(ans,now); } printf("%d\n",ans); } return 0; }
B题:排序+贪心,水题。
#include<bits/stdc++.h> #define REP(i,a,b) for(int i=a;i<=b;i++) using namespace std; typedef long long ll; const int maxn=1000100; int n,d; struct Node { ll m,s; friend bool operator<(Node A,Node B) { if(A.m<B.m) return 1; if(A.m==B.m) return A.s<B.s; return 0; } };Node a[maxn]; int main() { freopen("in.txt","r",stdin); while(cin>>n>>d){ REP(i,1,n){ scanf("%I64d%I64d",&a[i].m,&a[i].s); } ll ans=0,now=0; sort(a+1,a+n+1); int l=1,r=1; REP(r,1,n){ if(a[r].m-a[l].m<d) now+=a[r].s; else{ now+=a[r].s; while(a[r].m-a[l].m>=d) now-=a[l++].s; } //cout<<l<<" "<<r<<" "<<now<<endl; ans=max(ans,now); } cout<<ans<<endl; } return 0; }
C题:dfs,水题。
#include<bits/stdc++.h> #define REP(i,a,b) for(int i=a;i<=b;i++) #define PB push_back #define MS0(a) memset(a,0,sizeof(a)) using namespace std; typedef long long ll; const int maxn=1000100; int n,m; int has[maxn]; vector<int> G[maxn]; int u,v; int deg[maxn]; int dfs(int pre,int u,int cat) { if(has[u]) cat+=has[u]; else cat=0; if(cat>m) return 0; if(u!=1&°[u]==1) return 1; int res=0; for(int i=0;i<G[u].size();i++){ int v=G[u][i]; if(v==pre) continue; res+=dfs(u,v,cat); } return res; } int main() { //freopen("in.txt","r",stdin); while(cin>>n>>m){ REP(i,0,n) G[i].clear(); REP(i,1,n) scanf("%d",&has[i]); MS0(deg); REP(i,1,n-1){ scanf("%d%d",&u,&v); G[u].PB(v); G[v].PB(u); deg[u]++;deg[v]++; } printf("%d\n",dfs(0,1,0)); } return 0; }
D题:状压dp,TSP。
比赛的时候写的递推居然没过!!!!!!!!!赛后改成记忆化搜索直接1A了。。。。看来以后TSP就写记忆化搜索的形式比较保险一点。
#include<bits/stdc++.h> #define REP(i,a,b) for(int i=a;i<=b;i++) #define PB push_back #define MS0(a) memset(a,0,sizeof(a)) using namespace std; typedef long long ll; const int maxn=1100; const int INF=(1<<29); int n,m,k; ll c[maxn][maxn]; ll a[maxn]; ll x,y,z; ll dp[20][1<<20]; ll cnt[1<<20]; int Cnt(int x) { int res=0; for(int i=0;(1<<i)<=x;i++){ if(x&(1<<i)) res++; } return res; } void Init() { for(int i=0;i<(1<<20);i++){ cnt[i]=Cnt(i); } } ll dfs(int i,int s) { ll &res=dp[i][s]; if(~res) return res; if((s&(1<<i))==0) return res=-INF; if(cnt[s]==1) return res=a[i]; for(int j=0;j<n;j++){ if(i==j) continue; if(s&(1<<j)) res=max(res,dfs(j,s^(1<<i))+c[j][i]+a[i]); } return res; } int main() { freopen("in.txt","r",stdin); Init(); while(cin>>n>>m>>k){ REP(i,0,n-1) scanf("%I64d",&a[i]); MS0(c); while(k--){ scanf("%I64d%I64d%I64d",&x,&y,&z); x--;y--; c[x][y]=z; } memset(dp,-1,sizeof(dp)); ll ans=0; for(int i=0;i<n;i++){ for(int s=0;s<(1<<n);s++){ if(cnt[s]==m) ans=max(dfs(i,s),ans); } } printf("%I64d\n",ans); } return 0; }
虽然D题意外地没过,但还是涨分了,要是D题过了就直接涨到紫了,虽然没涨到紫,不过今天除了D题TSP没过时没能及时选择改成记忆化搜索的形式这点不好以外,其它的比赛策略手速基本没什么问题。感觉自己距离紫名越来越近了,不过还是要学更多的算法和数据结构,AC自动机,后缀自动机,splay,LCT,博弈论,数学,数论,计算几何,图论,各种dp,等等,还有很多很多要学。
对了,还有这场的E题,线段树.
E题:线段树+字符串hash
这题得另外写一个题解
#include<bits/stdc++.h> #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 using namespace std; typedef unsigned long long ull; const int maxn=100100; const int INF=(1<<29); const ull x=13LL; const ull p=1e9+7; int n,m,k; int q; int op,L,R,c; char s[maxn]; ull xp[maxn]; ull xs[maxn]; struct SegTree { int l,r; int tag; ull h; void debug(int rt) { printf("rt=%2d l=%2d r=%2d tag=%2d h=%2llu\n",rt,l,r,tag,h); } };SegTree T[maxn<<2]; void push_down(int rt,int l,int r,int m) { if(T[rt].tag!=-1){ T[rt<<1].tag=T[rt<<1|1].tag=T[rt].tag; T[rt<<1].h=((T[rt].tag%p)*(xs[m-l]%p))%p; T[rt<<1|1].h=((T[rt].tag%p)*(xs[r-m-1]%p))%p; T[rt].tag=-1; } } void push_up(int rt,int l,int r,int m) { T[rt].h=(T[rt<<1].h+((T[rt<<1|1].h%p)*(xp[m-l+1]%p)%p))%p; } void build(int l,int r,int rt) { T[rt].l=l;T[rt].r=r; T[rt].tag=-1; if(l==r){ T[rt].h=s[l-1]-'0'; return; } int m=(l+r)>>1; build(lson); build(rson); push_up(rt,l,r,m); } void update(int L,int R,int c,int l,int r,int rt) { if(L<=l&&r<=R){ T[rt].tag=c; T[rt].h=(c*xs[r-l])%p; return; } int m=(l+r)>>1; push_down(rt,l,r,m); if(L<=m) update(L,R,c,lson); if(R>m) update(L,R,c,rson); push_up(rt,l,r,m); } ull query(int L,int R,int l,int r,int rt) { if(L<=l&&r<=R) return T[rt].h; int m=(l+r)>>1; push_down(rt,l,r,m); ull res=0; if(L<=m){ if(R<=m) res=query(L,R,lson); else res=(query(L,R,lson)+((query(L,R,rson)%p)*xp[m-max(l,L)+1]))%p; } else res=query(L,R,rson); return res%p; } bool judge(int l1,int r1,int l2,int r2) { ull h1=query(l1,r1,1,n,1); ull h2=query(l2,r2,1,n,1); return h1==h2; } void Init() { xp[0]=1; for(ull i=1;i<maxn;i++) xp[i]=(xp[i-1]*x)%p; xs[0]=1; for(ull i=1;i<maxn;i++) xs[i]=(xs[i-1]+xp[i])%p; } int main() { freopen("in.txt","r",stdin); Init(); while(~scanf("%d%d%d",&n,&m,&k)){ scanf("%s",s); q=m+k; build(1,n,1); while(q--){ scanf("%d%d%d%d",&op,&L,&R,&c); if(op==1) update(L,R,c,1,n,1); else{ if(R-L+1==c) puts("YES"); else puts(judge(L,R-c,L+c,R)?"YES":"NO"); } } } return 0; }
没有AC不了的题,只有不努力的ACMER!