1. 程式人生 > >“玲瓏杯”ACM比賽 Round #18

“玲瓏杯”ACM比賽 Round #18

++ XML node start preview 表示 frame blog lns

“玲瓏杯”ACM比賽 Round #18

Start Time:2017-07-15 12:00:00 End Time:2017-07-15 15:46:00

A -- 計算幾何你瞎暴力

Time Limit:5s Memory Limit:256MByte

Submissions:1764Solved:348

DESCRIPTION

今天HHHH考完了期末考試,他在教學樓裏閑逛,他看著教學樓裏一間間的教室,於是開始思考:

如果從一個坐標為 (x1,y1,z1)(x1,y1,z1)的教室走到(x2,y2,z2)(x2,y2,z2)的距離為 |x1?x2|+|y1?y2|+|z1?z2||x1?x2|+|y1?y2|+|z1?z2|

那麽有多少對教室之間的距離是不超過RR的呢?

INPUT 第一行是一個整數T(1T10)T(1≤T≤10), 表示有TT組數據 接下來是TT組數據,對於每組數據: 第一行是兩個整數n,q(1n5×104,1q103)n,q(1≤n≤5×104,1≤q≤103), 表示有nn間教室, qq次詢問. 接下來是nn行, 每行3個整數xi,yi,zi(0xi,yi,zi10)xi,yi,zi(0≤xi,yi,zi≤10),表示這間教室的坐標. 最後是qq行,每行一個整數R(0R109)R(0≤R≤109),意思見描述. OUTPUT 對於每個詢問RR輸出一行一個整數,表示有多少對教室滿足題目所述的距離關系.
SAMPLE INPUT 1 3 3 0 0 0 1 1 1 1 1 1 1 2 3 SAMPLE OUTPUT 1 1 3 HINT 對於樣例,1號教室和2號教室之間的距離為3, 1號和3號之間的距離為3, 2號和3號之間的距離為0 SOLUTION 這道題就是要暴力,不過一般的暴力是要出問題的,因為數組你要開的特別大。所以我想FFT去做,可是不存在的啊,怎麽做的出來 xi,yi,zi(0xi,yi,zi10)xi,yi,zi(0≤xi,yi,zi≤10),這個是真的騷,所以就是10^6了,具體實現如下
#include <bits/stdc++.h>
using
namespace std; typedef long long LL; int M[11][11][11]; LL N[32]; int main(){ int t; cin>>t; while(t--){ memset(M,0,sizeof(M)); memset(N,0,sizeof(N)); int n,q; cin>>n>>q; for(int i=0;i<n;i++){ int x,y,z; cin>>x>>y>>z; M[x][y][z]++; } for(int i=0;i<11;i++) for(int j=0;j<11;j++) for(int k=0;k<11;k++) for(int l=0;l<11;l++) for(int m=0;m<11;m++) for(int n=0;n<11;n++){ if(i==j&&k==l&&m==n) N[0]+=M[i][k][m]*1LL*(M[i][k][m]-1); else N[abs(j-i)+abs(l-k)+abs(n-m)]+=M[i][k][m]*1LL*M[j][l][n]; } LL f=0; for(int i=0;i<31;i++){ N[i]+=f; f=N[i]; } while(q--){ int p; cin>>p; if(p>30) cout<<n*1LL*(n-1)/2<<endl; else cout<<N[p]/2<<endl; } } return 0; }
C -- 圖論你先敲完模板

Time Limit:5s Memory Limit:256MByte

Submissions:786Solved:201

DESCRIPTION

今天HHHH在操場上跑步,HHHH作為一個愛運動的人,肯定會想方設法把跑步所消耗的能量減到最少.

現在這個操場上有nn個可以休息的點,他們的坐標分別為x1,x2...xn(xixi+1)x1,x2...xn(xi≤xi+1),HHHH剛開始在 x1x1 ,並且他只能在這些點休息,在中途不能停下來,否則會因為旁邊的音浪太強而被晃到.

如果HHHH連續跑一段長度為ll的距離,那麽他將會消耗2l+a2l+a的能量(aa為HHHH的可愛值)

現在給你這些點的坐標,請幫HHHH計算他跑到xnxn點所需要消耗的能量最少是多少.

INPUT 第一行是一個整數T(1T10)T(1≤T≤10),表示有TT組數據 對於每組數據輸入一行2個整數n,a (1n105,1a106)n,a (1≤n≤105,1≤a≤106) 表示總共有nn個休息點,HHHH的可愛值為aa. 接著一行nn個數x1,x2...,xn(0xi3×106,0xi+1?xi30)x1,x2...,xn(0≤xi≤3×106,0≤xi+1?xi≤30),表示點的位置. OUTPUT 每組數據輸出一行,一個整數,表示最小需要花費的體力 SAMPLE INPUT 2 3 2 3 5 7 3 10 3 5 7 SAMPLE OUTPUT 12 26 HINT 對於第一組樣例,最少的體力消耗是先從3跑到5,消耗6點體力,再從5跑到7,消耗6點體力,共12點 對於第二組樣例,最少的體力消耗是直接從3跑到7,消耗26點體力. SOLUTION 圖論個皮皮蝦啊,分明就是dp,d[i]=min(d[j]+2xi?xj+a),t=2xi?xj,1e5?2^30,

“玲瓏杯”ACM比賽 Round #18