比赛记录
注意随机数据 ,1-n排列这种,一般都有啥暴力重构之类的方法,期望重构次数很少之类的
1005也是这样,因为n^2但只有n个值有数,所以就可以n^2logn
题解
1001 Salty Fish
unsolved.
1002 Nonsense Time
https://blog.csdn.net/liufengwei1/article/details/98785302
代码:
#include#define maxl 50010 using namespace std; int n,mxid,mxval; int a[maxl],kk[maxl],dy[maxl],ans[maxl]; int b[maxl],dp[maxl],frm[maxl]; bool in[maxl],froz[maxl]; inline void prework() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]),dy[a[i]]=i; for(int i=1;i<=n;i++) scanf("%d",&kk[i]),froz[i]=false; } inline void upd(int i,int x) { while(i<=n) { if(dp[b[i]]<dp[x]) b[i]=x; i+=i&-i; } } inline int qry(int i) { int res=0; while(i) { if(dp[res]<dp[b[i]]) res=b[i]; i-=i&-i; } return res; } inline void lis() { for(int i=1;i<=n;i++) in[i]=false,frm[i]=0,b[i]=0,dp[i]=0; int id;mxval=0;mxid=0; for(int i=1;i<=n;i++) if(!froz[i]) { id=qry(a[i]); dp[i]=dp[id]+1;frm[i]=id; if(dp[i]>mxval) mxval=dp[i],mxid=i; upd(a[i],i); } int u=mxid; while(u!=0) in[u]=true,u=frm[u]; } inline void mainwork() { lis(); for(int i=n;i>=1;i--) { ans[i]=mxval; froz[kk[i]]=true; if(in[kk[i]]) lis(); } } inline void print() { for(int i=1;i<=n;i++) printf("%d%c",ans[i],(i==n)?'\n':' '); } int main() { int t; scanf("%d",&t); for(int i=1;i<=t;i++) { prework(); mainwork(); print(); } return 0; }
1003 Milk Candy
unsolved.
1004 Speed Dog
unsolved.
1005 Snowy Smile
https://blog.csdn.net/liufengwei1/article/details/98762357
代码:
#include#define maxl 2010 using namespace std; int n,totx,toty; int ax[maxl],ay[maxl],w[maxl]; long long ans; long long a[maxl]; int numx[maxl],numy[maxl]; struct node { int l,r; long long sum,lrmx; long long rmx,lmx; }tree[maxl*4]; vector <int> tmpy[maxl]; inline void prework() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d%d%d",&ax[i],&ay[i],&w[i]); numx[i]=ax[i];numy[i]=ay[i]; } sort(numx+1,numx+1+n); totx=unique(numx+1,numx+1+n)-numx-1; for(int i=1;i<=totx;i++) tmpy[i].clear(); for(int i=1;i<=n;i++) { ax[i]=lower_bound(numx+1,numx+1+totx,ax[i])-numx; tmpy[ax[i]].push_back(i); } sort(numy+1,numy+1+n); toty=unique(numy+1,numy+1+n)-numy-1; for(int i=1;i<=n;i++) ay[i]=lower_bound(numy+1,numy+1+toty,ay[i])-numy; } inline void pushup(int k) { int ls=k<<1,rs=k<<1|1; tree[k].sum=tree[ls].sum+tree[rs].sum; tree[k].lrmx=max(tree[ls].lrmx,tree[rs].lrmx); tree[k].lrmx=max(tree[k].lrmx,tree[ls].rmx+tree[rs].lmx); tree[k].lmx=max(tree[ls].lmx,tree[rs].lmx+tree[ls].sum); tree[k].rmx=max(tree[rs].rmx,tree[ls].rmx+tree[rs].sum); } inline void build(int k,int l,int r) { tree[k].l=l;tree[k].r=r; if(l==r) { tree[k].sum=a[l]; tree[k].lrmx=tree[k].lmx=tree[k].rmx=max(0ll,a[l]); return; } int mid=(l+r)>>1,ls=k<<1,rs=k<<1|1; build(ls,l,mid); build(rs,mid+1,r); pushup(k); } inline void upd(int k,int l) { if(tree[k].l==tree[k].r) { tree[k].sum=a[l]; tree[k].lrmx=tree[k].lmx=tree[k].rmx=max(0ll,a[l]); return; } int mid=(tree[k].l+tree[k].r)>>1; if(l<=mid) upd(k<<1,l); else upd(k<<1|1,l); pushup(k); } inline void mainwork() { ans=0;int l,id; for(int lowx=1;lowx<=totx;lowx++) { for(int i=1;i<=toty;i++) a[i]=0; build(1,1,toty); for(int upx=lowx;upx<=totx;upx++) { l=tmpy[upx].size(); for(int i=0;i ) { id=tmpy[upx][i]; a[ay[id]]+=w[id]; upd(1,ay[id]); } ans=max(tree[1].lrmx,ans); } } } inline void print() { printf("%lld\n",ans); } int main() { int t; scanf("%d",&t); for(int i=1;i<=t;i++) { prework(); mainwork(); print(); } return 0; }
1006 Faraway
unsolved.
1007 Support or Not
unsolved.
1008 TDL
#includeusing namespace std; typedef long long LL; const int up=1005; const LL INF=2e18;//! int m; bool check(long long n,long long kn) { int cnt=0; if(n==0) return false; for(long long i=n+1;;i++) if(__gcd(n,i)==1) { cnt++; if(cnt==m) return kn==i; } return false; } int main() { int t; scanf("%d",&t); while(t--) { LL k,n; scanf("%lld%d",&k,&m); LL ans=INF; for(int i=1;i<=up;i++) { n=i^k; if(check(n,i+n)) ans=min(ans,n); } if(ans==INF) { puts("-1"); } else { printf("%lld\n",ans); } } return 0; }
1009 Three Investigators
unsolved.
1010 Ridiculous Netizens
unsolved.
1011 11 Dimensions
unsolved.
1012 Stay real
#include#define maxl 100010 #define mp make_pair using namespace std; int n; int a[maxl]; long long ans1,ans2; typedef pair<int,int> p; priority_queue q; bool in[maxl]; inline void prework() { while(!q.empty()) q.pop(); scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]),in[i]=true; if(i*2>n) q.push(mp(a[i],i)); } } inline void mainwork() { p d;ans1=0,ans2=0; for(int i=1;i<=n;i++) { d=q.top();q.pop(); in[d.second]=false; if(!in[d.second] && !in[d.second^1]) q.push(mp(a[d.second/2],d.second/2)); if(i&1) ans1+=d.first; else ans2+=d.first; } } inline void print() { printf("%lld %lld\n",ans1,ans2); } int main() { int t; scanf("%d",&t); for(int i=1;i<=t;i++) { prework(); mainwork(); print(); } return 0; }