【分塊】UVA 12003 Array Transformer 水題

點擊打開鏈接

比較水的分快,還不會爆LL

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#include <queue>
#include <stack>
#include <vector>
#include <deque>
#include <set>
#include <map>
typedef long long LL;
const int MAXN = 100009;//點數的最大值
const int MAXM = 1000010;//邊數的最大值
const LL INF = 1152921504;
typedef struct cao{
    LL num;
    int point;
    bool operator < (const cao &a)const
    {
        return num<a.num;
    }
};
bool cmp(cao a,cao b)
{
    return a.point<b.point;
}
struct node
{
    cao p[600];
    int num;
    void init()
    {
        num=0;
    }
    void Sort(){
        sort(p,p+num);
    }
    void rSort(){
        sort(p,p+num,cmp);
    }
    int query(int now,LL orz,int rt)
    {
        int ans=0;
        if(now==-1)
        {
            cao o;
            o.num=orz;
            ans=lower_bound(p,p+num,o)-p;
            return ans;
        }
        if(rt==0)
        {
            for(int i=0;i<num;i++)
            if(p[i].point>=now&&p[i].num<orz)
                ans++;
        }
        else{

            for(int i=0;i<num;i++)
            if(p[i].point<=now&&p[i].num<orz)
                ans++;
        }
        return ans;
    }
    void change(int q,LL val)
    {
        for(int i=0;i<num;i++)
        {
            if(q==p[i].point)
            {
                p[i].num=val;
                Sort();
                return ;
            }
        }
    }
}block[600];
int main()
{
    int n,m,l,r,p;
    LL u,v;
    while(scanf("%d%d%lld",&n,&m,&u)!=EOF)
    {
        int len=sqrt(n),lnum=0;
        for(int i=0;i<=len+1;i++)
            block[i].init();
        for(int i=0;i<n;i++)
        {
            block[lnum].p[block[lnum].num].point=i;
            scanf("%lld",&block[lnum].p[block[lnum].num++].num);
            if(block[lnum].num>=len&&(i!=n-1))
                lnum++;
        }
        for(int i=0;i<=lnum;i++)
            block[i].Sort();
        while(m--)
        {
            scanf("%d%d%lld%d",&l,&r,&v,&p);
            l--,r--,p--;
            int x=l/len;
            int y=r/len;
            int k=block[x].query(l,v,0);
            if(x!=y) k+=block[y].query(r,v,1);
            for(int i=x+1;i<y;i++)
            {
                k+=block[i].query(-1,v,0);
            }
            x=p/len;
            LL val=(u*(LL)k)/(LL)(r-l+1);
            block[x].change(p,val);
        }
        for(int i=0;i<=lnum;i++)
        {
            block[i].rSort();
            for(int j=0;j<block[i].num;j++)
                printf("%lld\n",block[i].p[j].num);
        }
    }
    return 0;

}
/*

*/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章