2391: Cirno的忧郁 - BZOJ
Description
Cirno闲着无事的时候喜欢冰冻青蛙。
Cirno每次从雾之湖中固定的n个结点中选出一些点构成一个简单多边形,Cirno运用自己的能力能将此多边形内所有青蛙冰冻。
雾之湖生活着m只青蛙,青蛙有大有小,所以每只青蛙的价值为一个不大于10000的正整数。
Cirno很想知道每次冻住的青蛙的价值总和。因为智商有限,Cirno将这个问题交给完美算术教室里的你。
因为爱护动物,所以每次冻结的青蛙会被放生。也就是说一只青蛙可以被多次统计。
Input
第一行2个正整数 n,m。
以下n行,每行2个整数xi,yi,表示第i个结点的坐标。
再以下m行,每行3个整数xj,yj,vj,表示第j个青蛙的坐标和价值。
第n+m+1行一个整数q,表示有q组询问。
每组询问有2行,第一行一个整数s(3<=s<=n),表示简单多边形的结点数。第二行s个正整数,顺时针或逆时针给出多边形的结点的编号(1--n)
Output
q行。
对于每个询问,每行输出一个整数表示冻结的青蛙的价值之和
Sample Input
4 3
2 2
3 5
7 4
5 1
3 4 2
4 3 7
6 3 90
2
3
1 2 3
4
1 4 3 2
Sample Output
9
99
【
HINT
数据范围】
对于30%的数据,n,m<=100; q<=100
对于60%的数据,n,m<=100; q<=10000
对于100%的数据,n,m<=1000; q<=10000
-10000<=x,y<=10000; 0<v<=10000
看见他三次了,还是写了吧
我们预处理出s[i,j]表示线段[i,j)下面的点权和
然后就可以像求多边形面积一样求权值和了
预处理这个很简单,枚举一个端点,然后极角排序,按顺序加点,用树状数组维护和加到点j的时候s[i,j]=sum(xi,xj-1),因为两个端点不能同时取要不然就多了,感觉有点像cdq分治
const
maxn=;
type
point=record
x,y,id,v:longint;
end;
aa=array[..maxn*]of longint;
var
a,b:array[..maxn*]of point;
s:array[..maxn,..maxn]of longint;
x,c:aa;
n,m,q:longint; procedure swap(var x,y:longint);
var
t:longint;
begin
t:=x;x:=y;y:=t;
end; procedure sort(l,r:longint;var a:aa);
var
i,j,y:longint;
begin
i:=l;j:=r;y:=a[(l+r)>>];
repeat
while a[i]<y do inc(i);
while a[j]>y do dec(j);
if i<=j then
begin
swap(a[i],a[j]);
inc(i);dec(j);
end;
until i>j;
if i<r then sort(i,r,a);
if j>l then sort(l,j,a);
end; operator -(a,b:point)c:point;
begin
c.x:=a.x-b.x;
c.y:=a.y-b.y;
end; operator *(a,b:point)c:longint;
begin
exit(a.x*b.y-a.y*b.x);
end; procedure swap(var x,y:point);
var
t:point;
begin
t:=x;x:=y;y:=t;
end; procedure sort(l,r:longint);
var
i,j:longint;
y:point;
begin
i:=l;j:=r;y:=a[(l+r)>>];
repeat
while (y-a[])*(a[i]-a[])< do inc(i);
while (y-a[])*(a[j]-a[])> do dec(j);
if i<=j then
begin
swap(a[i],a[j]);
inc(i);dec(j);
end;
until i>j;
if i<r then sort(i,r);
if j>l then sort(l,j);
end; function find(k:longint):longint;
var
l,r,mid:longint;
begin
l:=;r:=n+m;
while l<>r do
begin
mid:=(l+r)>>;
if x[mid]<k then l:=mid+
else r:=mid;
end;
exit(l);
end; procedure add(x,y:longint);
begin
while x<=n+m do
begin
inc(c[x],y);
x:=x+(x and (-x));
end;
end; function sum(x:longint):longint;
begin
sum:=;
while x> do
begin
inc(sum,c[x]);
x:=x-(x and (-x));
end;
end; procedure main;
var
i,j,cnt,ans:longint;
begin
read(n,m);
for i:= to n do
begin
read(a[i].x,a[i].y);
b[i]:=a[i];
a[i].id:=i;
end;
for i:=n+ to n+m do
read(a[i].x,a[i].y,a[i].v);
for i:= to n+m do
x[i]:=a[i].x;
sort(,n+m,x);
for i:= to n do
begin
for j:= to n+m do
c[j]:=;
a[]:=b[i];
cnt:=;
for j:= to n+m do
if (a[j].x>=a[].x) and ((a[j].x<>a[].x) or (a[j].y<>a[].y)) then
begin
inc(cnt);
swap(a[j],a[cnt]);
end;
sort(,cnt);
for j:= to cnt do
begin
if a[j].id> then s[i,a[j].id]:=sum(find(a[j].x)-)
else add(find(a[j].x),a[j].v);
end;
end;
for i:= to n do
for j:= to n do
if s[i,j]= then s[i,j]:=-s[j,i];
read(q);
for i:= to q do
begin
read(cnt);
for j:= to cnt do
read(x[j]);
ans:=;
for j:= to cnt do
inc(ans,s[x[j],x[j mod cnt+]]);
writeln(abs(ans));
end;
end; begin
main;
end.
2391: Cirno的忧郁 - BZOJ的更多相关文章
- [BZOJ2391]Cirno的忧郁
[BZOJ2391]Cirno的忧郁 试题描述 Cirno闲着无事的时候喜欢冰冻青蛙. Cirno每次从雾之湖中固定的n个结点中选出一些点构成一个简单多边形,Cirno运用自己的能力能将此多边形内所有 ...
- 「BZOJ2391」Cirno的忧郁
传送门 设p[0] = (-10001,-10001) 把所有点按p[0]极角排序, s[i][j]表示三角形p[0]p[i]p[j]内的总价值,若i到j极角增大则s为正,否则s为负. 那么答案就是按 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- Bzoj 2393: Cirno的完美算数教室 容斥原理,深搜
2393: Cirno的完美算数教室 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 287 Solved: 175[Submit][Status][ ...
- BZOJ 2393 Cirno的完美算数教室
就是爆搜嘛. 先从大到小排个序能减去dfs树上很大的一部分.这个技巧要掌握. #include<iostream> #include<cstdio> #include<c ...
- bzoj 2393 Cirno的完美算数教室(容斥原理+搜索)
[题意] 定义C数为只包含数字2和9的数,求[L,R]内能被C数整除的个数. [思路] Dfs预处理出C数,并去除其中倍数的情况. Dfs搜索出现情况,奇数加,偶数减,当数值大于R时剪枝. [代码] ...
- ●BZOJ 2393 Cirno的完美算数教室
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2393 题解: 容斥原理,暴力搜索,剪枝...和 [Scoi2010 幸运数字] 一样的(只是 ...
- bzoj 1853: [Scoi2010]幸运数字&&2393: Cirno的完美算数教室【容斥原理】
翻了一些blog,只有我用状压预处理嘛2333,.把二进制位的0当成6,1当成8就行啦.(2393是2和9 然后\( dfs \)容斥,加上一个数的\( lcm \),减去两个数的\( lcm \), ...
- [bzoj 2393] Cirno的完美算数教室 (容斥原理+dfs剪枝)
题目描述 CirnoCirnoCirno发现了一种bakabakabaka数,这种数呢只含有222和999两种数字 现在CirnoCirnoCirno想知道[L,R][L,R][L,R]中有多少个数能 ...
随机推荐
- MVC4 使用 ckfinder+ckeditor编辑器
配置ckfinder for asp.net 版本下载地址 http://cksource.com/ckfinder/downloadckeditor下载地址 http://ckeditor.com ...
- HTML+CSS学习总结:
1. 注释:<div> 是一个块级元素,也就是说,浏览器通常会在 div 元素前后放置一个换行符. 提示:请使用 <div> 元素来组合块级元素,这样就可以使用样式对它们进行格 ...
- Zend studio 12.5.1破解过程
开始学习php了 今天又安装了一下Zend 之前找了很久的教程终于成了 , 今天换了一台电脑需要重新安装一下 又点忘记了. 就讲这个过程写下来 1.安装zend studio 12.5.1.这个过程 ...
- cetos 7 常用命令
1. 安装 yum install 2. 可安装查找 yum search 3. 查找文件 whereis 4. 查看文件cat 5. 修改文件vi
- 分栏控制器和导航栏目tabBarItem,UINavigationController
//// AppDelegate.m// TabBarControllerDemo//// Created by qianfeng on 15/9/22.// Copyright (c) 20 ...
- WCF之数据契约
从抽象层面看,WCF能够托管CLR类型(接口和类)并将它们公开为服务,也能够以本地CLR接口和类的方式使用服务.然而,CLR类型却属于.NET的特定技术.由于面向服务的一个核心原则就是在跨越服务边界时 ...
- Mongo客户端MongoVUE的基本使用
这里没有涉及到服务器以及客户端的安装,文章主要介绍mongo客户端mongoVUE的使用 一.数据库连接 点击绿色加号添加一个连接,输入name.server.port,点击save,点击connec ...
- CSS3 resize属性 调整div大小
resize 用户可调整div大小 IE不支持 none 不可调整元素尺寸 both 可调整宽度高度 horizontal 可调整宽度 vertical 可调整高度 注意:如果属性生效,必须设置元素 ...
- 大饱眼福 7款类型各异的CSS3实用菜单
1.清新小图标的HTML5/CSS3侧边栏菜单 前我们分享过几款CSS3侧边栏菜单,像CSS3侧边栏菜单 带可爱的小图标菜单和CSS3侧边栏手风琴菜单,都非常不错.今天我们要分享的这款CSS3侧边栏菜 ...
- OLE-Excel基本操作
1.create object obj CREATE OBJECT EXCEL 'Excel.Application'. 这个obj通常指能够支持的应用程序 应用程序首先要满足OLE2的标准 同 ...