原文链接www.cnblogs.com/zhouzhendong/p/UOJ346.html

题解

首先按照 $m_i$ 的大小排个序。

如果某一个区间和一个 m 值比他小的区间有交,那么显然可以将这个区间控制的区域删除掉重合的那一段。

如果一个区间被删没了,那么显然答案为 0 。

在这个处理之后,一个区间可能会变得不连续。那么我们就将它前后相连,变成连续的。

接下来问题变成了对每一种权值的区间算答案。

这个东西离散化之后大力DP即可。

注意特判权值为 1 的区间。

写起来好像有点麻烦。

时间复杂度 $O(Tn^2)$ 。

代码

#pragma GCC optimize("Ofast","inline")
#include <bits/stdc++.h>
#define clr(x) memset(x,0,sizeof (x))
#define For(i,a,b) for (int i=a;i<=b;i++)
#define Fod(i,b,a) for (int i=b;i>=a;i--)
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
#define fi first
#define se second
#define _SEED_ ('C'+'L'+'Y'+'A'+'K'+'I'+'O'+'I')
#define outval(x) printf(#x" = %d\n",x)
#define outvec(x) printf("vec "#x" = ");for (auto _v : x)printf("%d ",_v);puts("")
#define outtag(x) puts("----------"#x"----------")
#define outarr(a,L,R) printf(#a"[%d...%d] = ",L,R);\
For(_v2,L,R)printf("%d ",a[_v2]);puts("");
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef vector <int> vi;
LL read(){
LL x=0,f=0;
char ch=getchar();
while (!isdigit(ch))
f|=ch=='-',ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return f?-x:x;
}
const int N=1005,mod=998244353;
int Pow(int x,int y){
int ans=1;
for (;y;y>>=1,x=(LL)x*x%mod)
if (y&1)
ans=(LL)ans*x%mod;
return ans;
}
void Add(int &x,int y){
if ((x+=y)>=mod)
x-=mod;
}
void Del(int &x,int y){
if ((x-=y)<0)
x+=mod;
}
int n,q,ub;
int Ha[N],hs=0;
int sum[N],vis[N];
struct S{
int L,R,v;
}a[N],b[N][N];
int c[N];
bool cmp(S a,S b){
if (a.v!=b.v)
return a.v<b.v;
if (a.L!=b.L)
return a.L<b.L;
return a.R<b.R;
}
int calc(int n,S *A){
static S a[N];
static int kill[N],len[N],pw0[N],pw1[N],iv0[N],iv1[N];
static int Ha[N],rp[N],dp[N];
int m=0,hs=0;
For(i,1,n-1)
assert(A[i].L<=A[i+1].L);
clr(kill);
For(i,1,n)
For(j,i+1,n)
if (A[i].L<=A[j].L&&A[j].R<=A[i].R)
kill[i]=1;
For(i,1,n)
Ha[++hs]=A[i].L,Ha[++hs]=A[i].R+1;
sort(Ha+1,Ha+hs+1);
hs=unique(Ha+1,Ha+hs+1)-Ha-1;
clr(len);
For(i,1,n){
int L=lower_bound(Ha+1,Ha+hs+1,A[i].L)-Ha;
int R=lower_bound(Ha+1,Ha+hs+1,A[i].R+1)-Ha;
For(j,L+1,R)
len[j]=Ha[j]-Ha[j-1];
}
For(i,1,n)
if (!kill[i])
a[++m]=A[i];
int v=a[1].v;
if (v==1)
return 1;
n=m;
pw0[1]=iv0[1]=1;
For(i,2,hs){
int tmp=len[i];
pw0[i]=(LL)pw0[i-1]*Pow(v-1,tmp)%mod;
pw1[i]=(Pow(v,tmp)-Pow(v-1,tmp)+mod)%mod;
iv0[i]=Pow(pw0[i],mod-2);
}
For(i,1,hs)
rp[i]=hs+1;
For(i,1,n){
a[i].L=lower_bound(Ha+1,Ha+hs+1,a[i].L)-Ha+1;
a[i].R=lower_bound(Ha+1,Ha+hs+1,a[i].R+1)-Ha;
For(j,1,a[i].L-1)
rp[j]=min(rp[j],a[i].R);
}
int ans=0;
clr(dp),dp[1]=1;
For(i,1,hs){
For(j,i+1,rp[i])
Add(dp[j],(LL)dp[i]*pw0[j-1]%mod*iv0[i]%mod*pw1[j]%mod);
if (rp[i]==hs+1)
Add(ans,(LL)dp[i]*pw0[hs]%mod*iv0[i]%mod);
}
return ans;
}
void Solve(){
n=read(),q=read(),ub=read();
clr(Ha),hs=0;
For(i,1,q){
a[i].L=read(),a[i].R=read(),a[i].v=read();
Ha[++hs]=a[i].L,Ha[++hs]=a[i].R+1;
}
Ha[++hs]=1,Ha[++hs]=n+1;
sort(Ha+1,Ha+hs+1);
hs=unique(Ha+1,Ha+hs+1)-Ha-1;
Ha[0]=1;
clr(vis);
sort(a+1,a+q+1,cmp);
int cnt=0;
for (int i=1,j;i<=q;i=j+1){
j=i,c[++cnt]=0;
while (j<q&&a[j+1].v==a[i].v)
j++;
For(k,1,hs)
sum[k]=sum[k-1]+(vis[k]?0:Ha[k]-Ha[k-1]);
For(k,i,j){
int L=a[k].L=lower_bound(Ha+1,Ha+hs+1,a[k].L)-Ha;
int R=a[k].R=lower_bound(Ha+1,Ha+hs+1,a[k].R+1)-Ha;
if (L==R){
puts("0");
return;
}
c[cnt]++;
b[cnt][c[cnt]].L=sum[L]+1;
b[cnt][c[cnt]].R=sum[R];
b[cnt][c[cnt]].v=a[k].v;
}
For(k,i,j)
For(t,a[k].L+1,a[k].R)
vis[t]=1;
}
int ans=1;
For(i,2,hs)
if (!vis[i])
ans=(LL)ans*Pow(ub,Ha[i]-Ha[i-1])%mod;
For(i,1,cnt)
ans=(LL)ans*calc(c[i],b[i])%mod;
cout<<ans<<endl;
}
int main(){
int T=read();
while (T--)
Solve();
return 0;
}

  

UOJ#346. 【清华集训2017】某位歌姬的故事 动态规划的更多相关文章

  1. Loj #2331. 「清华集训 2017」某位歌姬的故事

    Loj #2331. 「清华集训 2017」某位歌姬的故事 IA 是一名会唱歌的女孩子. IOI2018 就要来了,IA 决定给参赛选手们写一首歌,以表达美好的祝愿.这首歌一共有 \(n\) 个音符, ...

  2. 【UOJ#340】【清华集训2017】小 Y 和恐怖的奴隶主(矩阵快速幂,动态规划)

    [UOJ#340][清华集训2017]小 Y 和恐怖的奴隶主(矩阵快速幂,动态规划) 题面 UOJ 洛谷 题解 考虑如何暴力\(dp\). 设\(f[i][a][b][c]\)表示当前到了第\(i\) ...

  3. Loj #2324. 「清华集训 2017」小 Y 和二叉树

    Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...

  4. Loj #2321. 「清华集训 2017」无限之环

    Loj #2321. 「清华集训 2017」无限之环 曾经有一款流行的游戏,叫做 *Infinity Loop***,先来简单的介绍一下这个游戏: 游戏在一个 \(n \times m\) 的网格状棋 ...

  5. [LOJ#2330]「清华集训 2017」榕树之心

    [LOJ#2330]「清华集训 2017」榕树之心 试题描述 深秋.冷风吹散了最后一丝夏日的暑气,也吹落了榕树脚下灌木丛的叶子.相识数年的Evan和Lyra再次回到了小时候见面的茂盛榕树之下.小溪依旧 ...

  6. [LOJ#2324]「清华集训 2017」小Y和二叉树

    [LOJ#2324]「清华集训 2017」小Y和二叉树 试题描述 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙 ...

  7. [UOJ#274][清华集训2016]温暖会指引我们前行

    [UOJ#274][清华集训2016]温暖会指引我们前行 试题描述 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了一 ...

  8. Loj 2320.「清华集训 2017」生成树计数

    Loj 2320.「清华集训 2017」生成树计数 题目描述 在一个 \(s\) 个点的图中,存在 \(s-n\) 条边,使图中形成了 \(n\) 个连通块,第 \(i\) 个连通块中有 \(a_i\ ...

  9. loj #2325. 「清华集训 2017」小Y和恐怖的奴隶主

    #2325. 「清华集训 2017」小Y和恐怖的奴隶主 内存限制:256 MiB时间限制:2000 ms标准输入输出 题目类型:传统评测方式:文本比较   题目描述 "A fight? Co ...

随机推荐

  1. mysql8.0.15二进制安装

    mysql8.0.15二进制安装 今天有幸尝试安装了社区版本的mysql8.0.15,记录下来,供以后方便使用.特此感谢知数堂的叶老师,提供了配置文件的模板. # 第一部分:系统配置 # 1.安装系统 ...

  2. Jupyter Notebook 的安装使用以及 tree 路径变更

    由于最近开始学习 Python,进而接触到一个十分强大的交互式编辑器 — Jupyter Notebook,用起来也非常顺手,于是记录一下相关的使用过程. 一.安装 Python: ①首先前往 pyt ...

  3. 轻量Pythonweb - flask+jinja2

    后台代码 MVC from flask import Flask,request,render_template app = Flask(__name__) @app.route('/',method ...

  4. linux常用系统指令

    [linux常用系统指令] 查看内核版本:cat /proc/version 查看发行版本:cat /etc/issue 通过安装lsb的方式查看发行版本: yum provides */lsb_re ...

  5. 20164305 徐广皓 Exp1+ 逆向进阶

    实验内容 Task1 (5-10分) 自己编写一个64位shellcode.参考shellcode指导. 自己编写一个有漏洞的64位C程序,功能类似我们实验1中的样例pwn1.使用自己编写的shell ...

  6. 解决:在微信中访问app下载链接提示“已停止访问该网页”

    前言 现如今微信对第三方推广链接的审核是越来越严格了,域名在微信中分享转发经常会被拦截,一旦被拦截用户就只能复制链接手动打开浏览器粘贴才能访问,要不然就是换个域名再推,周而复始.无论是哪一种情况都会面 ...

  7. word20170103除了busy,忙的10种英语说法!

    年前,忙死啦!除了busy,这些说法更地道.更形象! #1 I'm swamped! Swamp: 沼泽“忙死了”最形象.最对应的英语说法:It's the end of the year. I'm ...

  8. 2018-2019-2 20165234 《网络对抗技术》 Exp5 MSF基础应用

    实验五 MSF基础应用 实验内容 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 1.一个主动攻击实践,ms08_067(成功) 2. 一个针对浏览器 ...

  9. Blocking Cross Origin API request for /api/contents Creating Notebook Failed An error occurred while creating a new notebook.

    anacoda安装的jupyter,使用nginx进行了转发,远程访问可以进去,但是创建文件和创建目录都会报错 浏览器页面报错: 第一次使用jupyter创建python时错误:Creating No ...

  10. Web前端-关于jQuerry

    jQuery-The write less,do more,jacascript library 非常方便的js库,封装了许多有用的功能. 1.jq与js对象之间的转换 <script> ...