获奖名单

题目传送门

Solution

不难看出,若我们单个 \(x\) 连 \((0,x),(x,0)\),两个连 \((x,y),(y,x)\) ,除去中间过对称轴的一个两个组,就是找很多个欧拉回路。

直接来就好了。

Code

#include <bits/stdc++.h>
using namespace std; #define Int register int
#define MAXN 500005 template <typename T> inline void read (T &t){t = 0;char c = getchar();int f = 1;while (c < '0' || c > '9'){if (c == '-') f = -f;c = getchar();}while (c >= '0' && c <= '9'){t = (t << 3) + (t << 1) + c - '0';c = getchar();} t *= f;}
template <typename T,typename ... Args> inline void read (T &t,Args&... args){read (t);read (args...);}
template <typename T> inline void write (T x){if (x < 0){x = -x;putchar ('-');}if (x > 9) write (x / 10);putchar (x % 10 + '0');} #define pii pair<int,int>
#define se second
#define fi first int n,m;
bool vis[MAXN];
vector <pii> g[MAXN]; int cnt,seq[MAXN];
void dfs (int u){
while (!g[u].empty()){
pii it = g[u].back();
g[u].pop_back();
if (vis[abs(it.se)]) continue;
vis[abs (it.se)] = 1,dfs (abs (it.fi)),seq[++ cnt] = it.se;
}
} signed main(){
read (n,m);
for (Int i = 1;i <= n;++ i){
int opt,x,y;read (opt,x);
if (opt == 1) g[0].push_back ({x,-i}),g[x].push_back ({0,i});
else read (y),g[x].push_back ({y,i}),g[y].push_back ({x,-i});
}
dfs (0);
vector <int> ansl,ansr;
for (Int i = 1;i <= cnt;i += 2) ansl.push_back (seq[i]);
for (Int i = 2;i <= cnt;i += 2) ansr.push_back (-seq[i]);
int mid = 0;
for (Int i = 1;i <= m;++ i){
sort (g[i].begin(),g[i].end());
for (Int j = 0;j < g[i].size();j += 2){
if (g[i][j].fi == i && g[i][j].se == -g[i][j + 1].se){
mid = abs(g[i][j].se);
continue;
}
if (g[i][j].fi > i || (g[i][j].fi == i && g[i][j].se < 0))
ansl.push_back (g[i][j].se),
ansr.push_back (-g[i][j + 1].se);
}
}
for (Int i = ansl.size() - 1;~i;-- i) write (abs(ansl[i])),putchar (' ');
if (mid) write (mid),putchar (' ');
for (Int i = 0;i < ansr.size();++ i) write (abs(ansr[i])),putchar (' ');
putchar ('\n');
for (Int i = ansl.size() - 1;~i;-- i) write (ansl[i] < 0),putchar (' ');
if (mid) write (0),putchar (' ');
for (Int i = 0;i < ansr.size();++ i) write (ansr[i] < 0),putchar (' ');
putchar ('\n');
return 0;
}

诡异操作

题目传送门

Solution

考虑使用线段树维护,对于一个线段树上的区间,我们可以维护 \(s_c\) 表示二进制位出现次数二进制第 \(c\) 位为 \(1\) 的和。你发现这个东西可以进行合并,并且取并操作可以直接对于每一个 \(s_c\) 并。

然后对于下取整操作可以直接暴力重构。

复杂度是个米奇妙妙复杂度,据说是 \(\Theta(128n+q\log^2n)\)。

Code

#include <bits/stdc++.h>
using namespace std; #define Int register int
#define MAXN 300005 template <typename T> inline void read (T &t){t = 0;char c = getchar();int f = 1;while (c < '0' || c > '9'){if (c == '-') f = -f;c = getchar();}while (c >= '0' && c <= '9'){t = (t << 3) + (t << 1) + c - '0';c = getchar();} t *= f;}
template <typename T,typename ... Args> inline void read (T &t,Args&... args){read (t);read (args...);}
template <typename T> inline void write (T x){if (x < 0){x = -x;putchar ('-');}if (x > 9) write (x / 10);putchar (x % 10 + '0');} typedef __uint128_t u128;
inline u128 read() {
static char buf[100];
scanf("%s", buf);
// std::cin >> buf;
u128 res = 0;
for(int i = 0;buf[i];++i) {
res = res << 4 | (buf[i] <= '9' ? buf[i] - '0' : buf[i] - 'a' + 10);
}
return res;
}
inline void output(u128 res) {
if(res >= 16)
output(res / 16);
putchar(res % 16 >= 10 ? 'a' + res % 16 - 10 : '0' + res % 16);
//std::cout.put(res % 16 >= 10 ? 'a' + res % 16 - 10 : '0' + res % 16);
} #define ll u128
ll a[MAXN];
int n,q,len[MAXN << 2]; ll res = ~ll(0);
struct Segment{
ll val[MAXN << 2][20],any[MAXN << 2],laz[MAXN << 2];
void pushup (int x){
memset (val[x],0,sizeof (u128) * len[x]);
int ls = x << 1,rs = x << 1 | 1;
val[x][0] = val[ls][0] ^ val[rs][0];ll car = val[ls][0] & val[rs][0];
for (Int i = 1;i < len[x];++ i){
ll w = val[ls][i] ^ val[rs][i];
val[x][i] = w ^ car,car = (car & w) | (val[ls][i] & val[rs][i]);
}
val[x][len[x]] = car,any[x] = any[x << 1] | any[x << 1 | 1];
}
ll getv (int x){
ll ans = 0;
for (Int i = 0;i <= len[x];++ i) ans += val[x][i] << i;
return ans;
}
void pushadd (int x,ll V){
for (Int i = 0;i <= len[x];++ i) val[x][i] &= V;
laz[x] &= V,any[x] &= V;
}
void pushdown (int x){pushadd (x << 1,laz[x]),pushadd (x << 1 | 1,laz[x]),laz[x] = res;}
void build (int x,int l,int r){
laz[x] = res,len[x] = 1;
while ((1 << len[x]) <= (r - l + 1)) ++ len[x];
if (l == r) return val[x][0] = any[x] = a[l],void ();
int mid = l + r >> 1;
build (x << 1,l,mid),build (x << 1 | 1,mid + 1,r);
pushup (x);
}
void modify1 (int x,int l,int r,int ql,int qr,ll V){
if (l >= ql && r <= qr) return pushadd (x,V),void ();
int mid = l + r >> 1;pushdown (x);
if (ql <= mid) modify1 (x << 1,l,mid,ql,qr,V);
if (qr > mid) modify1 (x << 1 | 1,mid + 1,r,ql,qr,V);
pushup (x);
}
void div (int x,int l,int r,ll V){
if (!any[x]) return ;
if (l == r) return any[x] = (val[x][0] /= V),void ();
int mid = l + r >> 1;pushdown (x);
div (x << 1,l,mid,V),div (x << 1 | 1,mid + 1,r,V);
pushup (x);
}
ll query (int x,int l,int r,int ql,int qr){
if (l >= ql && r <= qr) return getv (x);
int mid = l + r >> 1;pushdown (x);ll res = 0;
if (ql <= mid) res += query (x << 1,l,mid,ql,qr);
if (qr > mid) res += query (x << 1 | 1,mid + 1,r,ql,qr);
return res;
}
void modify2 (int x,int l,int r,int ql,int qr,ll V){
if (l >= ql && r <= qr) return div (x,l,r,V);
int mid = l + r >> 1;pushdown (x);
if (ql <= mid) modify2 (x << 1,l,mid,ql,qr,V);
if (qr > mid) modify2 (x << 1 | 1,mid + 1,r,ql,qr,V);
pushup (x);
}
}T; signed main(){
read (n,q);
for (Int i = 1;i <= n;++ i) a[i] = read ();
T.build (1,1,n);
while (q --> 0){
int opt,qL,qR;ll V;
read (opt,qL,qR);
if (opt <= 2){
V = read ();
if (opt == 1 && V > 1) T.modify2 (1,1,n,qL,qR,V);
else if (opt == 2) T.modify1 (1,1,n,qL,qR,V);
}
else output (T.query (1,1,n,qL,qR)),putchar ('\n');
}
return 0;
}

UOJ 2021 NOI Day2 部分题解的更多相关文章

  1. [LOJ 2720][BZOJ 5417][UOJ 395][NOI 2018]你的名字

    [LOJ 2720][BZOJ 5417][UOJ 395][NOI 2018]你的名字 题意 给定一个大串 \(S\) 以及 \(q\) 次询问, 每次询问给定一个串 \(T\) 和区间 \([l, ...

  2. 2021 NOI冬令营

    2021 NOI冬令营 -- 本来想写得稍微文艺一点的,但是停课这么久已经退化到不会写文章了. 毕竟省选了我才来补的,时间也过去很久了. 毕竟这次我没有获得任何奖项. 我唯一的获得就是-- --好好看 ...

  3. NOI Day2线上同步赛崩盘记

    Preface 蒟蒻愉快的NOI线上赛Day2之行,不过因为太菜就凉了 这次由于策略&&网络的问题,最后两题都没有交,结果就靠T1稳住拿了75分就回家了. 我真是太菜了. 屠龙勇士 首 ...

  4. JLOI2015 DAY2 简要题解

    「JLOI2015」骗我呢 题意 问有多少个 \(n \times m\) 的矩阵 \(\{x_{i, j}\}\) 满足 对于 \(\forall i \in [1, n], j \in [1, m ...

  5. SCOI2016 Day2 简要题解

    「SCOI2016」妖怪 题意 有 \(n\) 只妖怪,每只妖怪有攻击力 \(\text{atk}\) 和防御力 \(\text{dnf}\) ,在环境 \((a, b)\) 下,它可以把攻击力和防御 ...

  6. SCOI 2015 Day2 简要题解

    「SCOI2015」小凸玩密室 题意 小凸和小方相约玩密室逃脱,这个密室是一棵有 $ n $ 个节点的完全二叉树,每个节点有一个灯泡.点亮所有灯泡即可逃出密室.每个灯泡有个权值 $ A_i $,每条边 ...

  7. NOI 2014简要题解

    Day 1.Problem A. 起床困难综合症 100分做法: 把数字看成二进制数.对于初始攻击力.我们将其拆成32位,并求出每一位为0和1时经过全部防御门之后分别得到的数字.然后就是按位贪心了,我 ...

  8. NOI 2016 Day1 题解

    今天写了NOI2016Day1的题,来写一发题解. T2 网格 题目传送门 Description \(T\) 次询问,每次给出一个 \(n\times m\) 的传送门,上面有 \(c\) 个位置是 ...

  9. [CSP-S 2021] 廊桥分配 题解

    写篇题解来纪念我炸掉的CSP 唯一会做的题代码写挂了(痛苦面具 思路 我看到这道题第一眼想到的是线段树,感觉可以用线段树维护飞机入站到出战的这段时间,想了半天想不到代码怎么写. 国内机场与国外机场要分 ...

随机推荐

  1. 解锁 VS Code 更多可能性,轻松入门 WebView

    作者:HelloGitHub-小夏 说起 VS Code 大家普遍印象应该都差不多是这样:不就是个编辑器嘛,最主要的还是 coding 的快感咯. 里面很多功能都应该是围绕如何提高 coding 效率 ...

  2. vsftpd 参数说明

    2021-07-28 该文章为转载文章,非原创 参数作用# 是否允许匿名访问 [ 12行 ]anonymous_enable=[YES|NO]# 是否允许本地用户访问( /etc/passwd中的用户 ...

  3. Python语法之选择和循环(if、while)

    前言:在程序开发中,一共有三种流程方式: 顺序:从上向下,顺序执行代码 分支:根据条件判断,决定执行代码的分支 循环:让特定代码重复执行(解决程序员重复工作) 1.判断的定义: 如果条件满足,才能做某 ...

  4. Python中的文件处理和数据存储json

    前言:每当需要分析或修改存储在文件中的信息时,读取文件都很有用,对数据分析应用程序来说尤其如此. 例如,你可以编写一个这样的程序:读取一个文本文件的内容,重新设置这些数据的格式并将其写入文件,让浏览器 ...

  5. 性能测试工具JMeter 基础(二)—— 主界面介绍

    主界面介绍 JMeter的主界面主要分为菜单导航栏.工具栏.计划树标签栏.内容栏 菜单导航栏:全部的功能的都包含在菜单栏中 工具栏:相当于菜单栏常用功能的快捷按钮 计划树标签栏:显示测试用例(计划)相 ...

  6. Filter案例之登录验证

    一.登录验证,权限控制 1.需求分析 其中,登录有关的资源被访问时要直接放行,不然会死循环: 2.代码实现

  7. zt:我使用过的Linux命令之ar - 创建静态库.a文件

    我使用过的Linux命令之ar - 创建静态库.a文件 本文链接:http://codingstandards.iteye.com/blog/1142358    (转载请注明出处) 用途说明 创建静 ...

  8. CodeForce-791B Bear and Friendship Condition(并查集)

    Bear Limak examines a social network. Its main functionality is that two members can become friends ...

  9. C++ windows 函数讲解(一)获得屏幕分辨率

    先上代码: #include<bits/stdc++.h> #include<windows.h> using namespace std; int main() { int ...

  10. ecshop刷新页面出现power by ecshop和链接的解决办法

    当小伙伴在使用echop模板进行修改的时候,如果你删掉底部自带版权后,再调试程序刷新界面的时候,时不时就会冒出一个power by ecshop,而且是带有链接的,很不舒服,所以需要去掉,下面是最简单 ...