并不能ac jsoi2009

来源:互联网 发布:淘宝介入后对卖家影响 编辑:程序博客网 时间:2024/04/30 16:56

看到这种题目,,下意识先来了个莫队。。。然后。。。想想加个set。不就好了。。看看复杂度n^1.5*logn可能会卡过去吧。。。然后就写了一下。。然后就tle了。。。

 
#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<map>#include<set>#define N 100005#define ll int using namespace std;int n,m,ans;int pos[N],c[N];ll read(){    ll x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}struct cmp1{   bool operator()(const int &k1, const int &k2)const    {  return k1<k2;}  };map<int,int,cmp1> mp1;multiset<int> tree;struct data{int l,r,id;ll val;}a[N];bool cmp(data a,data b){if(pos[a.l]==pos[b.l])return a.r<b.r;return a.l<b.l;}bool cmp_id(data a,data b){return a.id<b.id;}void init(){n=read(); m=read();for(int i=1;i<=n;i++)  c[i]=read();int block=int(sqrt(n));for(int i=1;i<=n;i++)   pos[i]=(i-1)/block+1;for(int i=1;i<=m;i++){ a[i].l=read(); a[i].r=read();    a[i].id=i;    }}void update(int x,int f){int k=c[x]; map<int,int>::iterator iter; if(f==1) {mp1[k]++;  if(mp1[k]==1)  {   iter=mp1.find(k);   map<int,int>::iterator iter0;   if(iter!=mp1.begin())    { iter0=iter;iter0--;    int r3=(iter->first)-(iter0->first);  tree.insert(r3);  }    map<int,int>::iterator iter2=iter;iter2++;    if(iter2!=mp1.end())    {        int r1=(iter2->first)-(iter->first);tree.insert(r1);  }if((iter2!=mp1.end())&&(iter!=mp1.begin())) { int r2=(iter2->first)-(iter0->first); tree.erase(r2); }   }    }else   { mp1[k]--; if(mp1[k]==0)  {    iter=mp1.find(k);   map<int,int>::iterator iter0;   if(iter!=mp1.begin())    { iter0=iter;iter0--;    int r3=(iter->first)-(iter0->first);  tree.erase(r3);  }          map<int,int>::iterator iter2=iter;iter2++;    if(iter2!=mp1.end())    {        int r1=(iter2->first)-(iter->first);tree.erase(r1);  }if((iter2!=mp1.end())&&(iter!=mp1.begin()))  { int r2=(iter2->first)-(iter0->first); tree.insert(r2);      }      mp1.erase(k);     }   }}void solve(){ for(int i=1,l=1,r=0;i<=m;i++){for(;r<a[i].r;r++)update(r+1,1);for(;r>a[i].r;r--)    update(r,-1);for(;l<a[i].l;l++)    update(l,-1);for(;l>a[i].l;l--)    update(l-1,1);a[i].val=*(tree.begin());}}int main(){init();sort(a+1,a+m+1,cmp);solve();sort(a+1,a+m+1,cmp_id);for(int i=1;i<=m;i++)    printf("%d\n",a[i].val);return 0;}
程序有错的话请大神指出,明天再去看标算。。。

0 0