HGOI20190812 省常中互测5
Task 1 辩论
有N 个参加辩论的候选人,每个人对这两个议题都有明确的态度,支持或反对。
作为组织者,小D 认真研究了每个候选人,并给每个人评估了一个非负的活跃度,
他想让活跃度之和尽可能大。
选出的候选人必须满足以下两个条件:
1. 至少有一半的人支持议题1。
2. 至少有一半的人支持议题2。
小D 想知道,在满足以上两个条件的情况下,活跃度之和最大是多少。对于$ 100\%$ 的数据,$ N \leq 4 \times 10^5,0 ≤ Ai ≤ 5 \times 10^3 $
Sol : 首先$11$的全部都可以选,然后将$01$ 和 $10$排序,依次选取,把一组最大的$10$和$10$当做$11$处理,
剩余的情况就是$10$或$01$ $00$,这样子显然会让一个数逐渐的趋向于小于Sum/2,所以这个时候直接就挑权值大的数找即可。
复杂度是$O(n \ log_2 \ n)$
# include<bits/stdc++.h>
# define int long long
using namespace std;
vector<int>a1,a2,a3,a4,tmp;
int n;
signed main()
{
scanf("%lld",&n);
for (int i=;i<=n;i++) {
int op,v; scanf("%lld%lld",&op,&v);
if (op==) a1.push_back(v);
else if (op==) a2.push_back(v);
else if (op==) a3.push_back(v);
else if (op==) a4.push_back(v);
}
sort(a1.begin(),a1.end()); reverse(a1.begin(),a1.end());
sort(a2.begin(),a2.end()); reverse(a2.begin(),a2.end());
sort(a3.begin(),a3.end()); reverse(a3.begin(),a3.end());
int num=,ans=,all=;
for (int i=;i<a1.size();i++) num++,ans+=a1[i],all++;
int pos;
for (pos=;pos<min(a2.size(),a3.size());pos++) {
ans+=a2[pos]+a3[pos]; num++; all+=;
}
for (int i=pos;i<a2.size();i++) tmp.push_back(a2[i]);
for (int i=pos;i<a3.size();i++) tmp.push_back(a3[i]);
for (int i=;i<a4.size();i++) tmp.push_back(a4[i]);
sort(tmp.begin(),tmp.end()); reverse(tmp.begin(),tmp.end());
for (int i=;i<tmp.size();i++) {
if (*num>=all+) ans+=tmp[i],all++;
else break;
}
printf("%lld\n",ans);
return ;
}
A.cpp
Task 2 数独
考虑一个六边形数独,3个方向的每一行都需要填不同的数,并且一个子六边形内部都需要填不同的数。
填写数的值域是$[1,K]$
现在,有一些格子已经填好了数,询问字典序第$n$小的方案,
对于$ 100\%$ 的数据,$k ≤ 31,N ≤ 100000$
Sol : 直接dfs,然后对有关系的点直接存点的编号,由于数的大小为$31$所以可以用二进制数表示填是否填数,
这样就不用开数组模拟了,位运算非常快,然后就基本上没有优化的空间了,本题是一个NP问题。
# pragma GCC optimize()
# include<bits/stdc++.h>
using namespace std;
int zu[][]={
{,},{,,,,},{,,,,,},{,,,,},{,,,,,},{,,,,},{,},
{,},{,,,,},{,,,,,},{,,,,},{,,,,,},{,,,,},{,},
{,},{,,,,},{,,,,,},{,,,,},{,,,,,},{,,,,},{,},
{,,,,,,},{,,,,,,},{,,,,,,},{,,,,,,},
{,,,,,,},{,,,,,,},{,,,,,,}
};
int a[],n,k;
vector<int>v[];
int get(int pos)
{
int lim=;
for (int i=;i<v[pos].size();i++) {
int to=a[v[pos][i]];
lim|=(<<to);
}
return lim;
}
void dfs(int pos)
{
if (pos==) {
n--;
if (!n){
puts("Found");
for (int i=;i<=;i++) printf("%d ",a[i]);
puts("");
exit();
}
return;
}
if (a[pos]) { dfs(pos+); return;}
int tmp=get(pos);
for (int i=;i<=k;i++)
if (!((<<i)&tmp)) a[pos]=i,dfs(pos+),a[pos]=;
}
int main()
{
for (int i=;i<;i++) {
for (int j=;j<;j++)
if (zu[i][j]> && zu[i][k]>) {
for (int k=;k<;k++) if (zu[i][j]!=zu[i][k])
v[zu[i][j]].push_back(zu[i][k]);
v[zu[i][k]].push_back(zu[i][j]);
}
}
for (int i=;i<=;i++) {
sort(v[i].begin(),v[i].end());
v[i].erase(unique(v[i].begin(),v[i].end()),v[i].end());
}
scanf("%d%d",&k,&n);
for (int i=;i<=;i++) scanf("%d",&a[i]);
dfs();
puts("No way");
return ;
}
B.cpp
HGOI20190812 省常中互测5的更多相关文章
- HGOI 20190816 省常中互测8
Problem A 有两条以(0,0)为端点,分别经过(a,b),(c,d)的射线,你要求出夹在两条射线中间,且距离(0,0)最近的点(x,y) 对于$100\%$的数据满足$1 \leq T \l ...
- HGOI20190814 省常中互测7
Problem A 中间值 对于$2$个非严格单增序列$\{A_n\} , \{B_n\}$,维护下列两个操作: 1 x y z: (x=0)时将$A_y = z$ , (x=1)时将$B_y = z ...
- HGOI20190813 省常中互测6
Problem A 蛋糕 将$n \times m $大小的蛋糕切成每块为$1 \times 1$大小的$n\times m$块. 交换任意两块蛋糕的切割顺序的方案算作一种. 对于$100 \%$的数 ...
- HGOI20190811 省常中互测4
Problem A magic 给出一个字符串$S$,和数字$n$,要求构造长度为$n$只含有小写字母的字符串$T$, 使得在$T$中存在删除且仅删除一个子串使得$S=T$成立. 输出$T$的构造方案 ...
- HGOI20190810 省常中互测3
Problem A 夏洛特 若当前处在点$(x,y)$下一时刻可以向该点四周任意方向走动一步, 初始在$(0,0)$是否存在一条合法的路线满足下列$n$个限制: 每一个限制形如$t_i , x_i ...
- HGOI20190809 省常中互测2
Problem A 时之终结 构造一个含有$n$个节点的无重边无自环的有向图, 使得从$1$出发,每一次经过一条$(u,v) (u < v)$的边到达节点$n$的方案恰好有$y$种. 对于$10 ...
- HGOI20190808 省常中互测1
Problem A sum 给出$n$个元素的序列$\{a_i\}$,求出两个不相交连续子序列的最大元素和. 即对于$1 \leq A \leq B \leq C \leq D \leq n$最大化 ...
- 【2018集训队互测】【XSY3372】取石子
题目来源:2018集训队互测 Round17 T2 题意: 题解: 显然我是不可能想出来的……但是觉得这题题解太神了就来搬(chao)一下……Orzpyz! 显然不会无解…… 为了方便计算石子个数,在 ...
- 【CH 弱省互测 Round #1 】OVOO(可持久化可并堆)
Description 给定一颗 \(n\) 个点的树,带边权. 你可以选出一个包含 \(1\) 顶点的连通块,连通块的权值为连接块内这些点的边权和. 求一种选法,使得这个选法的权值是所有选法中第 \ ...
随机推荐
- 传统Java Web(非Spring Boot)、非Java语言项目接入Spring Cloud方案--temp
技术架构在向spring Cloud转型时,一定会有一些年代较久远的项目,代码已变成天书,这时就希望能在不大规模重构的前提下将这些传统应用接入到Spring Cloud架构体系中作为一个服务以供其它项 ...
- Centos 安装Pycharm 并移动到桌面。
版权声明:版权所有.未经同意不得转发,装载 https://blog.csdn.net/limingyue0312/article/details/81805826 1.下载pycharm软件包 网页 ...
- # ACM奇淫技巧
目录 ACM奇淫技巧 差分操作 坐标旋转 ACM 卡常优化 vsc代码块(头文件模板) 读入输出优化 逗号表达式 内联函数inline 寄存器变量register 条件判断加减代替取模 自增运算符优化 ...
- CSP 最大的矩形(201312-3)
问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi.这n个矩形构成了一个直方图.例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3 ...
- MFC多线程的创建使用
最近学习了MFC多线程的使用, 写了一个继承CWinThread类的类MyThread: 在头文件开头用#define定义一个线程函数入口地址(会在下面定义代码中写出) 在类的开头加上IMPLEMEN ...
- 2019年8月23日 星期五(Workerman)
Workerman,高性能socket服务框架 Workerman是什么? Workerman是一款纯PHP开发的开源高性能的PHP socket 服务框架. Workerman不是重复造轮子,它不是 ...
- 如何同步多个 git 远程仓库
请看 -> 如何同步多个 git 远程仓库
- springboot(十八)-session共享
前言 在传统的单服务架构中,一般来说,只有一个服务器,那么不存在 Session 共享问题,但是在分布式/集群项目中,Session 共享则是一个必须面对的问题,先看一个简单的架构图: 在这样的架构中 ...
- iServer-Linux环境下开机自启动实现
备注:该方案的前提是linux环境下已经安装部署好了iServer 1.在/etc/init.d/目录下创建iserver服务脚本文件. [root@localhost /]# vim /etc/in ...
- Windows常用快捷键与常用命令
应用窗口: Alt+F4 关闭当前窗口Win+上 最大化当前窗口Win+下 最小化当前窗口WIN+D 最小化所有窗口/还原Win+Tab 切换窗口 常用工具: Win+R 打开运行对话框Win+E 打 ...
