题目描述



区间绝对众数

即出现次数>len/2下取整的数

对于区间[L,R]扫一遍,维护一个数x和出现次数s

当前数=x则s+1,否则s-1,若s已为0则把x设为当前数

若区间内存在绝对众数,那么就算用其他的数和其抵消后仍然能剩余

因此最后的x就是可能的绝对众数(当区间内存在时)


推广到本题,设d=100/p下取整,对于线段树内每个区间维护d个可能的强国

显然一个国家在两个区间内都是弱国的话合并后不可能变成强国,因此可能的强国只有这2d个国家

合并一下,若合并后多于d个就把第d+1个去消前d个

原理同上,一个强国一次会消掉至少d个数,全部消完后还有剩余

而题目又允许出现弱国,所以可以这样搞

code

#include <bits/stdc++.h>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define ll long long
#define file
using namespace std; char ch;
void get(int &x)
{
x=0;
ch=getchar();
while (ch<'0' || ch>'9') ch=getchar();
while (ch>='0' && ch<='9') x=x*10+(ch-'0'),ch=getchar();
}
void put(int x)
{
int a[8],len=0; if (!x) putchar('0');
while (x) {a[++len]=x%10;x/=10;}
while (len) {putchar(a[len--]+'0');}
} int a[150001],Tr[600001],n,Q,p,d,tp,i,j,k,l,x,y,z; //Tr<0:1 >0:2
struct type{
int x,s;
inline void clear() {x=s=0;}
};
bool cmp(type a,type b) {return a.s>b.s;}
struct arr{
type a[11]; inline void clear() {int i;fo(i,1,10) a[i].clear();}
void merge(arr b)
{
int i,j,N=0,tot=0; fo(i,1,d) if (a[i].s) N=tot=i; else break;
fo(i,1,d)
if (b.a[i].s)
{
fo(j,1,N)
if (b.a[i].x==a[j].x)
{a[j].s+=b.a[i].s;break;} if (j>N)
a[++tot]=b.a[i];
}
else
break; if (tot)
{
stable_sort(a+1,a+tot+1,cmp); if (tot>d)
{
fo(i,1,d)
{
a[i].s-=a[d+1].s;
if (!a[i].s)
a[i].x=0;
}
tot=d;
}
}
fo(i,tot+1,10) a[i].clear();
}
} tr[600001],ans; int merge(int x,int y)
{
if (!x || y<0) return y;
if (x<0) return x-y;
return x+y;
} void down(int t,int len)
{
int i; if (Tr[t])
{
if (len>1) Tr[t*2]=merge(Tr[t*2],Tr[t]),Tr[t*2+1]=merge(Tr[t*2+1],Tr[t]); if (Tr[t]<0)
{
tr[t].clear();
tr[t].a[1]={-Tr[t],len};
}
else
{
fo(i,1,d)
if (tr[t].a[i].s)
tr[t].a[i].x+=Tr[t];
else
break;
} Tr[t]=0;
}
} void up(int t)
{
tr[t]=tr[t*2];
tr[t].merge(tr[t*2+1]);
} void mt(int t,int l,int r)
{
int mid=(l+r)/2; if (l==r)
{
tr[t].a[1]={a[l],1};
return;
} mt(t*2,l,mid);
mt(t*2+1,mid+1,r); up(t);
} void change(int t,int l,int r,int x,int y,int s)
{
int mid=(l+r)/2; down(t,r-l+1);
if (x<=l && r<=y)
{
Tr[t]=s;
down(t,r-l+1);
return;
} down(t*2,mid-l+1);
down(t*2+1,r-mid); if (x<=mid)
change(t*2,l,mid,x,y,s);
if (mid<y)
change(t*2+1,mid+1,r,x,y,s); up(t);
} void find(int t,int l,int r,int x,int y)
{
int mid=(l+r)/2; down(t,r-l+1);
if (x<=l && r<=y)
{
ans.merge(tr[t]);
return;
} if (x<=mid)
find(t*2,l,mid,x,y);
if (mid<y)
find(t*2+1,mid+1,r,x,y);
} int main()
{
freopen("war.in","r",stdin);
#ifdef file
freopen("war.out","w",stdout);
#endif get(n);get(Q);get(p);d=100/p;
fo(i,1,n) get(a[i]);
mt(1,1,n); for (;Q;--Q)
{
get(tp); if (Q<0 || n!=150000)
n=n; switch (tp)
{
case 1:{
get(x);get(y);get(z); change(1,1,n,x,y,-z);
break;
}
case 2:{
get(x);get(y); change(1,1,n,x,y,1);
break;
}
case 3:{
get(x);get(y);
ans.clear();
find(1,1,n,x,y); fo(k,1,d)
if (!ans.a[k].s)
{break;}
--k; put(k);putchar(' ');
fo(i,1,k)
put(ans.a[i].x),putchar(' ');
putchar('\n');
break;
}
}
} fclose(stdin);
fclose(stdout); return 0;
}

6487. 【GDOI2020模拟02.29】列强争霸war的更多相关文章

  1. 6485. 【GDOI2020模拟02.25】沙塔斯月光

    题目描述 题解 镇♂男则反 如果没有操作3很好办,反着做维护操作1的次数即可 实际上一次操作3的贡献是zi*(∑i到操作1位置的距离) 维护一下即可O(n^4) code #include <b ...

  2. JZOJ 5184. 【NOIP2017提高组模拟6.29】Gift

    5184. [NOIP2017提高组模拟6.29]Gift (Standard IO) Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed ...

  3. [jzoj NOIP2018模拟10.29]

    OI生涯的最高分,来了纪中这么多天,在经历了这么多场“NOIP难度”的模拟赛之后,终于看到了真正的NOIP 今天考场上效率很高,很快码完了全部的题目,留下了足够的时间对拍和...发呆.不得不说看着电脑 ...

  4. 「模拟8.29」chinese(性质)·physics·chemistry(概率期望)

    T1  chinese 根据他的问题i*f[i]我们容易联想到,答案其实是每种方案中每个点的贡献为1的加和 我们可以转变问题,每个点在所有方案的贡献 进而其实询问就是1-k的取值,有多少中方案再取个和 ...

  5. 【模拟7.29】大佬(概率期望DP)

    首先根据数据范围,可以判断基本上是n^2的复杂度 通过分析我们发现每一次都可以从m个数中任意选,既然任意选,那么此时的概率的分母就是不变的,然而题中涉及的是某一段的最大值,所以我们按套路假设 f[i] ...

  6. Cheatsheet: 2016 02.01 ~ 02.29

    Web How to do distributed locking Writing Next Generation Reusable JavaScript Modules in ECMAScript ...

  7. [jzoj]2505.【NOIP2011模拟7.29】藤原妹红

    Link https://jzoj.net/senior/#main/show/2505 Description 在幻想乡,藤原妹红是拥有不老不死能力的人类.虽然不喜欢与人们交流,妹红仍然保护着误入迷 ...

  8. jzoj2700 【GDKOI2012模拟02.01】数字

    传送门:https://jzoj.net/senior/#main/show/2700 [题目大意] 令n为正整数,S(n)为n的各位数字之和,令

  9. jzoj2701 【GDKOI2012模拟02.01】矩阵

    传送门:https://jzoj.net/senior/#main/show/2701 [题目大意] 给出矩阵A,求矩阵B,使得

随机推荐

  1. [原]C++新标准之std::chrono::time_point

    原 总结 STL 标准库 chrono time_point ratio  概览 类定义 总结 思考 拓展 system_clock steady_clock high_resolution_cloc ...

  2. Lamda过滤替换List元素的属性值

    import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List; ...

  3. AOP实现防止接口重复提交

    项目中对于状态变更接口存在重复提交的问题. package com.yxx.survey.foundation.aop; import com.alibaba.fastjson.JSON; impor ...

  4. python语法基础-文件操作-长期维护

    ###############    python-简单的文件操作  ############### # python中文件的操作 # 文件操作的基本套路 # 1,打开文件,默认是是只读方式打开文件 ...

  5. Nearby Bicycles

    With fast developments of information and communication technology, many cities today have establish ...

  6. ROS中的日志(log)消息

    学会使用日志(log)系统,做ROS大型项目的主治医生 通过显示进程的运行状态是好的习惯,但需要确定这样做不会影响到软件的运行效率和输出的清晰度.ROS 日志 (log) 系统的功能就是让进程生成一些 ...

  7. 数位dp——BZOJ1026 Windy数

    1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MB Description windy定义了一种windy数.不含前导零且相邻 ...

  8. python学习笔记(7)数据类型转换

  9. 企业框架-Spring

    1.什么是Spring Spring是最受欢迎的企业级Java应用程序开发框架,数以百万的来自世界各地的开发人员使用Spring框架来创建性能好.易于测试.可重用的代码. Spring框架是一个开源的 ...

  10. [LC] 485. Max Consecutive Ones

    Given a binary array, find the maximum number of consecutive 1s in this array. Example 1: Input: [1, ...