题目描述



区间绝对众数

即出现次数>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. 【转】Linux虚拟终端命令Screen用法详解

    转自 http://www.linuxidc.com/Linux/2013-07/87415.htm 在使用ssh或者telnet登录远程主机后,执行一些耗时的命令,如果此时ssh或者telnet中断 ...

  2. 解决python pip 出现read time out问题

    出现read time out问题是一般由于python包被墙导致下载速度变慢,pip下载超时. 解决方法一: 添加 --default-timeout:自定义timeout时间,一般能解决大部分ti ...

  3. Solving ordinary differential equations I(nonstiff problems),exercise 1.1

    Solve equation $y'=1-3x+y+x^2+xy$ with another initial value $y(0)=1$. Solve: We solve this by using ...

  4. Nginx_配置文件解读及模板

    Nginx 介绍 # nginx的最大优势在于处理静态文件和代理转发功能,支持7层负载均衡和故障隔离. 动静分离是每个网站发展到一定规模之后必然的结果.静态请求则应当最好将其拆分,并启用独立的域名,既 ...

  5. 吴裕雄--天生自然C语言开发:递归

    void recursion() { statements; ... ... ... recursion(); /* 函数调用自身 */ ... ... ... } int main() { recu ...

  6. iOS仿QQ侧滑菜单、登录按钮动画、仿斗鱼直播APP、城市选择器、自动布局等源码

    iOS精选源码 QQ侧滑菜单,右滑菜单,QQ展开菜单,QQ好友分组 登录按钮 3分钟快捷创建高性能轮播图 ScrollView嵌套ScrolloView(UITableView .UICollecti ...

  7. 吴裕雄--天生自然python学习笔记:python文档操作表格处理

    表格也是 Word 文件中常用的对象,下面讲解 Win32com 中常用的表格操作命令 . 新建表格的语法为: 在 Word 文件中新建一个表格并插入单元格内容 在 Word 文件中新建一个 3 行 ...

  8. mac osx 下 浏览器 开启 java

    工作环境mac osx 浏览器 chrome:63.0.3239.132 (Official Build) (64-bit)firefox: 57.0.4 (64 位)safari:Version 1 ...

  9. JVM 的内存布局

    这是jdk7以后的版本 1. Heap(堆区) Heap OOM 障最主要的发源地, 它存储着几乎所有的实例对象, 堆由垃圾收集器自动回收, 堆区由各子线程共享使用.通常情况下 它占用的空间是所有内存 ...

  10. ajax异步的加深理解

    过去印象中的ajax的异步操作,一直还居然在$.ajax函数内部的异步,真是大错特错,实际的异步操作,是针对整个js文件来的. 今天总算意识到了,实际情况如下: $(function(){ //[弹框 ...