1. 程式人生 > >決鬥[雅禮集訓 2017 Day10]

決鬥[雅禮集訓 2017 Day10]

alt har begin sum 分享圖片 its blog else color

技術分享圖片

SOL:我們可以證明,設Sum[x]代表1到X編號的矮人被sum[x]個精靈挑為對手,則Sum[x]-x min的位置和其後一個是沒有任何關系的(沒有精靈會從這個矮人走向下一個矮人)。

那麽我們就把其拆成了單鏈。貪心就好。

#pragma GCC optimize("O2")
#include<bits/stdc++.h>
#define sight(c) (‘0‘<=c&&c<=‘9‘)
#define N 500031
#define eho(x) for(int j=head[x];j;j=net[j])
inline void read(int
&x){ static char c; for (c=getchar();!sight(c);c=getchar()); for (x=0;sight(c);c=getchar())x=x*10+c-48; } using namespace std; void write(int x) {if (x<10) {putchar(0+x);return;} write(x/10); putchar(0+x%10);} inline void writeln(int x) {if (x<0) putchar(-),x*=-1; write(x); putchar(
\n);} int a[N],c[N],d[N],g[N],n,t,ans,mn,head[N],net[N],fall[N],tot,sum,k; inline void add(int x,int y) {fall[++tot]=y; net[tot]=head[x];head[x]=tot;} bool b[N]; set<int> S; set<int> ::iterator it; int main () { // freopen("b.in","r",stdin); read(n); mn=1e9; for (int i=1
;i<=n;i++) read(a[i]),g[a[i]]++,add(a[i],i); for (int i=1;i<=n;i++) read(c[i]); for (int i=1;i<=n;i++) read(d[i]); for (int i=1;i<=n;i++) { sum=sum+g[i]; if (mn>sum-i) mn=sum-i,k=i; } for (int i=1;i<=n;i++) { if (++k>n) k=1; eho(k) S.insert(d[fall[j]]); it=S.upper_bound(c[k]); if (it==S.end()) S.erase(*S.begin()); else ans++,S.erase(*it); } writeln(ans); }

決鬥[雅禮集訓 2017 Day10]