zoukankan      html  css  js  c++  java
  • HDU-3874 Necklace 线段树+离线

      题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3874

      比较简单的题,题意也好懂。

      先O(n)求每个数左边第一次出现的与他相同的数的位置l[i]。对询问按照y从小大排序,然后按照从左到右的顺序来跟新点,当前点为i,那么删掉l[i],加入点i,然后遇到询问求和。

      1 //STATUS:C++_AC_2593MS_10024KB
      2 #include <functional>
      3 #include <algorithm>
      4 #include <iostream>
      5 //#include <ext/rope>
      6 #include <fstream>
      7 #include <sstream>
      8 #include <iomanip>
      9 #include <numeric>
     10 #include <cstring>
     11 #include <cassert>
     12 #include <cstdio>
     13 #include <string>
     14 #include <vector>
     15 #include <bitset>
     16 #include <queue>
     17 #include <stack>
     18 #include <cmath>
     19 #include <ctime>
     20 #include <list>
     21 #include <set>
     22 #include <map>
     23 using namespace std;
     24 //#pragma comment(linker,"/STACK:102400000,102400000")
     25 //using namespace __gnu_cxx;
     26 //define
     27 #define pii pair<int,int>
     28 #define mem(a,b) memset(a,b,sizeof(a))
     29 #define lson l,mid,rt<<1
     30 #define rson mid+1,r,rt<<1|1
     31 #define PI acos(-1.0)
     32 //typedef
     33 typedef __int64 LL;
     34 typedef unsigned __int64 ULL;
     35 //const
     36 const int N=50010,M=200010;
     37 const int INF=0x3f3f3f3f;
     38 const int MOD=95041567,STA=8000010;
     39 const LL LNF=1LL<<60;
     40 const double EPS=1e-8;
     41 const double OO=1e15;
     42 const int dx[4]={-1,0,1,0};
     43 const int dy[4]={0,1,0,-1};
     44 const int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
     45 //Daily Use ...
     46 inline int sign(double x){return (x>EPS)-(x<-EPS);}
     47 template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
     48 template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
     49 template<class T> inline T lcm(T a,T b,T d){return a/d*b;}
     50 template<class T> inline T Min(T a,T b){return a<b?a:b;}
     51 template<class T> inline T Max(T a,T b){return a>b?a:b;}
     52 template<class T> inline T Min(T a,T b,T c){return min(min(a, b),c);}
     53 template<class T> inline T Max(T a,T b,T c){return max(max(a, b),c);}
     54 template<class T> inline T Min(T a,T b,T c,T d){return min(min(a, b),min(c,d));}
     55 template<class T> inline T Max(T a,T b,T c,T d){return max(max(a, b),max(c,d));}
     56 //End
     57 
     58 struct Node{
     59     int a,b,id;
     60     bool operator < (const Node& a)const {
     61         return b<a.b;
     62     }
     63 }q[M];
     64 LL sum[N<<2],ans[M];
     65 int num[N],l[N],la[1000010];
     66 int T,n,m;
     67 
     68 void update(int l,int r,int rt,int w,int val)
     69 {
     70     if(l==r){
     71         sum[rt]=val;
     72         return;
     73     }
     74     int mid=(l+r)>>1;
     75     if(w<=mid)update(lson,w,val);
     76     else update(rson,w,val);
     77     sum[rt]=sum[rt<<1]+sum[rt<<1|1];
     78 }
     79 
     80 LL query(int l,int r,int rt,int L,int R)
     81 {
     82     if(L<=l && r<=R){
     83         return sum[rt];
     84     }
     85     int mid=(l+r)>>1;
     86     LL ret=0;
     87     if(L<=mid)ret+=query(lson,L,R);
     88     if(R>mid)ret+=query(rson,L,R);
     89     return ret;
     90 }
     91 
     92 int main()
     93 {
     94   //  freopen("in.txt","r",stdin);
     95     int i,j,k;
     96     scanf("%d",&T);
     97     while(T--)
     98     {
     99         scanf("%d",&n);
    100         mem(la,0);
    101         for(i=1;i<=n;i++){
    102             scanf("%d",&num[i]);
    103             l[i]=la[num[i]];
    104             la[num[i]]=i;
    105         }
    106         scanf("%d",&m);
    107         for(i=0;i<m;i++){
    108             scanf("%d%d",&q[i].a,&q[i].b);
    109             q[i].id=i;
    110         }
    111         sort(q,q+m);
    112         mem(sum,0);k=0;
    113         for(i=1;i<=n;i++){
    114             if(l[i]){
    115                 update(1,n,1,l[i],0);
    116             }
    117             update(1,n,1,i,num[i]);
    118             for(;q[k].b==i && k<m;k++){
    119                 ans[q[k].id]=query(1,n,1,q[k].a,q[k].b);
    120             }
    121         }
    122         for(i=0;i<m;i++){
    123             printf("%I64d
    ",ans[i]);
    124         }
    125     }
    126     return 0;
    127 }
  • 相关阅读:
    python
    django admin 扩展
    django-cms 代码研究(八)app hooks
    django-cms 代码研究(七)杂七杂八
    django revision
    django-cms 代码研究(六)plugin的深入分析
    django-cms 代码研究(五)深入(代码结构)
    c# 如何使用wlanapi连接电脑到wifi
    django-cms 代码研究(四)CMS_TEMPLATE标签
    django静态文件查找逻辑
  • 原文地址:https://www.cnblogs.com/zhsl/p/3398341.html
Copyright © 2011-2022 走看看