===========19.8.26===============
qwq.昨晚打了 codeforces 真的是惨不忍睹
本来下午做了kick start 有点点信心了
结果1交不上题 2手抖写错 3B一直wa 心态有点炸 还掉分
contest/1208/problem/B
题目是 一个区间,让你中间删掉一块使得剩下的都不重复。
我写的是加长一倍然后求,wa了之后一个半小时都没有跳出来。
其实呢,加长一倍可以解决这样的问题:对于 1 2 2 2 3 3 4 组成了1 2 2 2 3 [3 4 | 1 2 ]2 2 3 3 4 完美的首位相接了
但是写法有问题 必须要首位相接才符合情况,题目给的意思和导向的意思都有一点点误导性。
如果组成 1 1 2 3 4 5 1 1 (单组数据, 还没相接)
实际上这个是不符合标准的。因为没法通过删掉一段来达到每个都不同。
如果重点着眼于不重复的1 2 3 4 5 ,实际上只能从中间删掉的话,最后的答案是删掉7个,因为必须保证首尾。
不知道说什么,总之简单的首尾相连,有这个小弊端。。。 会越过首尾考虑,所以谨慎加长。还不如写个暴力。。
卡壳了我也不知改怎么办。。。-。-。跳不出思维框架 实际上就像那次校赛 百聊无赖的情况下 。。。。。
可能还真是题意读错了。。。。。。。
看nimphy的代码:(这个set思想挺好的)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> #define rep(i,a,b) for(int i=a;i<=b;i++) using namespace std; const int maxn=400010; int L[maxn],R[maxn],a[maxn],b[maxn],tot,ans; int vis[maxn],N; int main() { int A,B,T; scanf("%d",&N); ans=N-1; rep(i,1,N) scanf("%d",&a[i]),a[i+N]=a[i],b[i]=a[i]; sort(b+1,b+N+1); tot=unique(b+1,b+N+1)-(b+1); rep(i,1,N+N) a[i]=lower_bound(b+1,b+tot+1,a[i])-b; rep(i,1,N) { int j=i; vis[a[j]]=i; while(j+1<=i+N-1&&vis[a[j+1]]!=i){ j++; vis[a[j]]=i; } if(i==1||j>=N) ans=min(ans,N-(j-i+1)); } printf("%d ",ans); return 0; }