求助/ll

P2652 同花顺

```cpp #include<bits/stdc++.h> #define int long long #define mem(x,y) memset(x,y,sizeof(x)) using namespace std; int read(){ int s = 0,w = 1; char ch = getchar(); while(ch < '0' || ch > '9'){if(ch == '-')w = -1;ch = getchar();} while(ch >= '0' && ch <= '9')s = s * 10 + ch - '0',ch = getchar(); return s * w; } struct node{ int col; int w; }e[100010],e1[100010]; int n; int bl[100010],br[100010]; int cnt; int tot; int ans = 2147483647; int cntt; bool cmp(node x,node y){ if(x.col != y.col)return x.col < y.col; else return x.w < y.w; } signed main(){ cin>>n; for(int i = 1;i <= n;i ++)e1[i].col = read(),e1[i].w = read(); sort(e1 + 1,e1 + n + 1,cmp); for(int i = 1;i <= n;i ++){ if(e1[i].col != e1[i - 1].col || e1[i].w != e1[i - 1].w){ cntt ++; e[cntt].col = e1[i].col; e[cntt].w = e1[i].w; } } for(int i = 1;i <= cntt;i ++){ if(e[i].col != e[i - 1].col){ br[cnt] = i - 1; cnt ++; bl[cnt] = i; } } br[cnt] = cntt; //for(int i = 1;i <= cnt;i ++)cout<<bl[i]<<" to "<<br[i]<<endl; for(int i = 1;i <= cnt;i ++){ for(int j = bl[i];j <= br[i];j ++){ if(e[j].w < n)continue; int s,s1; int l,r,mid; l = bl[i],r = j; int num = e[j].w - n + 1; while(l <= r){ mid = (l + r) / 2; if(e[mid].w >= num)r = mid - 1,s = mid; else l = mid + 1; } s = l; s1 = j; // cout<<"s = "<<s<<endl<<"s1 = "<<s1<<endl; ans = min(ans,n - (s1 - s + 1)); } } cout<<ans; } ```
by EDqwq @ 2021-06-02 23:39:45


|